GVKun编程网logo

具有整数仿真的Python类(正整数用python)

16

对于具有整数仿真的Python类感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍正整数用python,并为您提供关于4.C类型对应的Python类型、Python-PyTorch:IndexEr

对于具有整数仿真的Python类感兴趣的读者,本文将会是一篇不错的选择,我们将详细介绍正整数用python,并为您提供关于4. C类型对应的Python类型、Python - PyTorch:IndexError:只有整数、切片(`:`)、省略号(`...`)、numpy.newaxis(`None`)和整数或布尔数组是有效的索引、python – 如何将列表中的所有整数相乘、python – 整数除法:对于所有整数a,b,// b == int(a / b)为真吗?的有用信息。

本文目录一览:

具有整数仿真的Python类(正整数用python)

具有整数仿真的Python类(正整数用python)

给出以下示例:

class Foo(object):
    def __init__(self,value=0):
        self.value=value

    def __int__(self):
        return self.value

我想要一个类 Foo ,它充当整数(或浮点数)。所以我想做以下事情:

f=Foo(3)
print int(f)+5 # is working
print f+5 # TypeError: unsupported operand type(s) for +: 'Foo' and 'int'

第一条语句print int(f)+5有效,因为有两个整数。第二个失败,因为我必须实现__add__对我的班级执行此操作。

因此,要实现整数行为,我必须实现所有整数仿真方法。我该如何解决。我试图从继承int,但是这种尝试没有成功。

更新资料

int如果要使用,则继承失败__init__

class Foo(int):
    def __init__(self,some_argument=None,value=0):
        self.value=value
        # do some stuff

    def __int__(self):
        return int(self.value)

如果您再致电:

f=Foo(some_argument=3)

你得到:

TypeError: 'some_argument' is an invalid keyword argument for this function

经过Python 2.5和2.6测试

4. C类型对应的Python类型

4. C类型对应的Python类型

类型对比表

ctypes type C type Python type
c_bool _Bool bool (1)
c_char char 1-character bytes object
c_wchar wchar_t 1-character string
c_byte char int
c_ubyte unsigned char int
c_short short int
c_ushort unsigned short int
c_int int int
c_uint unsigned int int
c_long long int
c_ulong unsigned long int
c_longlong __int64 or long long int
c_ulonglong unsigned __int64 or unsigned long long int
c_size_t size_t int
c_ssize_t ssize_t or Py_ssize_t int
c_float float float
c_double double float
c_longdouble long double float
c_char_p char * (NUL terminated) bytes object or None
c_wchar_p wchar_t * (NUL terminated) string or None
c_void_p void * int or None
  • char 与 wchar 之间,一个是C类型单字节的编码,一个是 Unicode 两个字节的编码,通常这两个之间可以通过decode和encode的方式进行相互之间转换。
  1. 普通类型赋值

    由于python是无类型的,创建了一个对象并赋值了之后,对这个对象再次赋值将会变成新的类型。 所以通常以类的方式或者容器的方式进行赋值。即通过添加属性的方式赋值。

    普通类型赋值

    	from ctypes import *
    	a = c_int(2)
    	print(type(a))
    	a = 2
    	print(type(a))
    	a = c_int(2)
    	a.value = 3
    	print(a)
    	"""
    	<class ''ctypes.c_long''>
    	<class ''int''>
    	c_long(3)
    	[Finished in 0.1s]
    	"""
    

    非匹配类型赋值

    如果是非对应类型赋值,会先进行转换成为对应类型,类比C.

  2. 字符串创建

    • C风格字符串

      ctypes.create_string_buffer(init_or_size, size=None) 创建一个字符串缓冲区,可以进行修改,类比char buffer[size]={init_or_size} init_or_size必须是int类型的(表示创建大小),或者是bytes类型的用于初始化。

      	from ctypes import *
      	buf = create_string_buffer(10)
      	print(sizeof(buf),buf,type(buf),buf.raw,buf.value)
      	buf = create_string_buffer(b"test",10)
      	print(sizeof(buf),buf,type(buf),buf.raw,buf.value)
      	buf = create_string_buffer(b"test")
      	print(sizeof(buf),buf,type(buf),buf.raw,buf.value)
      	"""
      	10 <ctypes.c_char_Array_10 object at 0x037A9460> <class ''ctypes.c_char_Array_10''> b''\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'' b''''
      	10 <ctypes.c_char_Array_10 object at 0x03835100> <class ''ctypes.c_char_Array_10''> b''test\x00\x00\x00\x00\x00\x00'' b''test''
      	5 <ctypes.c_char_Array_5 object at 0x037A9460> <class ''ctypes.c_char_Array_5''> b''test\x00'' b''test''
      	[Finished in 0.1s]
      	"""
      
    • Unicdoe风格

      ctypes.create_unicode_buffer(init_or_size, size=None) 创建一个Unicode类型的字符数组缓冲区,对应Python类型c_wchar "ass"普通类型字符串,对应C类型wchar.

      	from ctypes import *
      	buf = create_unicode_buffer(10)
      	print(sizeof(buf),buf,type(buf),buf.value)
      	buf = create_unicode_buffer("test",10)
      	print(sizeof(buf),buf,type(buf),buf.value)
      	buf = create_unicode_buffer("test")
      	print(sizeof(buf),buf,type(buf),buf.value)
      	"""
      	20 <ctypes.c_wchar_Array_10 object at 0x00AB94F0> <class ''ctypes.c_wchar_Array_10''> 
      	20 <ctypes.c_wchar_Array_10 object at 0x02B15100> <class ''ctypes.c_wchar_Array_10''> test
      	10 <ctypes.c_wchar_Array_5 object at 0x00AB94F0> <class ''ctypes.c_wchar_Array_5''> test
      	[Finished in 0.1s]
      	"""
      
  3. 可以通用的类型。

    有几种类型是可以直接像C类型一样使用的,如intstring,bytes,这几种可以和上面几种进行类型对照。能匹配的都可以进行直接使用。

  4. 自定义类型作为参数。

    添加属性_as_parameter_,同时可以通过property进行构造。

    	from ctypes import *
    	class Test:
    		_as_parameter_ = 12
    	cdll.msvcrt.printf(b"%d\n",Test())
    	"""
    	12
    	[Finished in 0.1s]
    	"""
    

    只能是int bytes string也可以是通过property进行修改。

    	from ctypes import *
    	class Test:
    		def _getx(self):
    			return 12
    		_as_parameter_ = property(_getx,None,None,"ok")
    	cdll.msvcrt.printf(b"%d\n",Test())
    	"""
    	12
    	[Finished in 0.1s]
    

Python - PyTorch:IndexError:只有整数、切片(`:`)、省略号(`...`)、numpy.newaxis(`None`)和整数或布尔数组是有效的索引

Python - PyTorch:IndexError:只有整数、切片(`:`)、省略号(`...`)、numpy.newaxis(`None`)和整数或布尔数组是有效的索引

如何解决Python - PyTorch:IndexError:只有整数、切片(`:`)、省略号(`...`)、numpy.newaxis(`None`)和整数或布尔数组是有效的索引?

我正在使用 PyTorch 解决 BERT 的文本分类问题。这是我正在使用的 PyTorch 数据集格式,但是当我尝试访问来自数据集的输入时出现错误。

PyTorch 数据集

数据集返回一个包含以下内容的字典:idsmasktoken_type_idstargets

class JigsawDataset:
    def __init__(self,df,train_transforms = None):
        self.comment_text = df["comment_text"].values
        self.target = df["toxic"].values
        self.tokenizer = config.BERT_TOKENIZER
        self.max_len = config.MAX_LEN
        self.langs = df["lang"].values
        self.train_transforms = train_transforms

    def __len__(self):
        return len(self.comment_text)

    def __getitem__(self,item):
        comment_text = str(self.comment_text[item])
        comment_text = " ".join(comment_text.split())
        lang = self.langs[item]
        
        if self.train_transforms:
            comment_text,_ = self.train_transforms(data=(comment_text,lang))[''data'']

        inputs = self.tokenizer.encode_plus(
            comment_text,None,add_special_tokens=True,max_length=self.max_len,pad_to_max_length=True,truncation=True,)

        ids = inputs["input_ids"]
        mask = inputs["attention_mask"]
        token_type_ids = inputs["token_type_ids"]

        data_loader_dict = {}
        data_loader_dict["ids"] = torch.tensor(ids,dtype=torch.long)
        data_loader_dict["mask"] = torch.tensor(mask,dtype=torch.long)
        data_loader_dict["token_type_ids"] = torch.tensor(token_type_ids,dtype=torch.long)
        data_loader_dict["targets"] = torch.tensor(self.target[item],dtype=torch.float)
        
        
        return data_loader_dict

出现错误的相关代码

在这种情况下,我试图仅加载 1 个样本并使其成为 PyTorch 数据集的格式

df = pd.read_csv("dataset.csv")
df = df.head(1) # Trying with only 1 Sample
dataset = JigsawDataset(df)

ids = dataset["ids"]    # Error occurs at this line
mask = dataset["mask"]
token_type_ids = ["token_type_ids"]

错误

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-78-4608dd623cac> in <module>
      3 dataset = JigsawDataset(df)
      4 
----> 5 ids = dataset["ids"]    # Error occurs at this line
      6 mask = dataset["mask"]
      7 token_type_ids = ["token_type_ids"]

<ipython-input-40-121d8aa71516> in __getitem__(self,item)
     13 
     14     def __getitem__(self,item):
---> 15         comment_text = str(self.comment_text[item])
     16         comment_text = " ".join(comment_text.split())
     17         lang = self.langs[item]

IndexError: only integers,slices (`:`),ellipsis (`...`),numpy.newaxis (`None`) and integer or boolean arrays are valid indices

如何解决这个问题?

解决方法

根据 the docs,panda 的 DataFrame 对象的方法 ''values'' 返回一个 numpy 数组。
在您的代码中,您将属性 ''self.comment_text'' 设置为由 ''df["comment_text"].values'' 返回的 numpy 数组(代码框 1 中的第 3 行)。
Numpy 数组不接受字符串作为索引。
很难给你一个答案,我相信不测试它就可以工作,但我会从将属性“self.comment_text”设置为数据帧或它的副本开始,而不仅仅是它所包含的值。

我会改变这个:

class JigsawDataset:
    def __init__(self,df,train_transforms = None):
        self.comment_text = df["comment_text"].values
        self.target = df["toxic"].values
        self.tokenizer = config.BERT_TOKENIZER
.
.
.

为此:

class JigsawDataset:
    def __init__(self,train_transforms = None):
        self.comment_text = df["comment_text"]
        self.target = df["toxic"].values
        self.tokenizer = config.BERT_TOKENIZER
.
.
.
,

我发现了问题。

错误代码

ids = dataset["ids"]    
mask = dataset["mask"]
token_type_ids = ["token_type_ids"]

正确的代码

ids = dataset[0]["ids"]    
mask = dataset[0]["mask"]
token_type_ids = [0]["token_type_ids"]

问题是“ids”、“mask”和“token_type_ids”是字典键。 JigsawDataset 为每个样本返回一个字典。因此,为了访问样本,我们需要在指定键之前指定索引 ([0])。

python – 如何将列表中的所有整数相乘

python – 如何将列表中的所有整数相乘

参见英文答案 > How to multiply individual elements of a list with a number?                                    4个
>             How do I multiply each element in a list by a number?                                    7个
您好,我想将列表中的整数相乘.

例如;

l = [1,2,3]
l = [1*2,2*2,3*2]

输出:

l = [2,4,6]

所以我在网上搜索,大多数答案是关于将所有整数相互乘以,例如:

[1 * 2 * 3]

解决方法

试试 list comprehension:

l = [x * 2 for x in l]

这通过l,将每个元素乘以2.

当然,有不止一种方法可以做到这一点.如果你进入lambda functions和map,你甚至可以做到

l = map(lambda x: x * 2,l)

将函数lambda x:x * 2应用于l中的每个元素.这相当于:

def timesTwo(x):
    return x * 2

l = map(timesTwo,l)
@H_301_54@

python – 整数除法:对于所有整数a,b,// b == int(a / b)为真吗?

python – 整数除法:对于所有整数a,b,// b == int(a / b)为真吗?

我知道如果数字都是正数,则整数除法将始终返回与浮点结果截断相同的答案.如果其中一个或两个都是否定的,这是真的吗?

我只是想知道是否有一个整数除法表达式会在Python 2和Python 3中返回相同的结果(是的,我从__future__ import division中知道).

附:我们暂时忽略浮点溢出.

解决方法

在Python 3中不是这样,你可以自己测试它:
>>> int(-1/3) == -1//3
False

分别给出q(商)和r(余数)的a和b的整数除法和模数将总是返回满足b * qr == a和(a * b)> 0 == q> 0的数字(即a * b)和q具有相同的符号)和abs(r)< ABS(Q).如果q是浮点数,则表达式int(q)总是向0舍入. 除非你使用__future__ import division,否则它总是适用于Python 2,但那是因为a / b == a // b如果a和b是Python 2中的整数.

今天关于具有整数仿真的Python类正整数用python的介绍到此结束,谢谢您的阅读,有关4. C类型对应的Python类型、Python - PyTorch:IndexError:只有整数、切片(`:`)、省略号(`...`)、numpy.newaxis(`None`)和整数或布尔数组是有效的索引、python – 如何将列表中的所有整数相乘、python – 整数除法:对于所有整数a,b,// b == int(a / b)为真吗?等更多相关知识的信息可以在本站进行查询。

本文标签: