对于具有整数仿真的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)
- 4. C类型对应的Python类型
- Python - PyTorch:IndexError:只有整数、切片(`:`)、省略号(`...`)、numpy.newaxis(`None`)和整数或布尔数组是有效的索引
- python – 如何将列表中的所有整数相乘
- python – 整数除法:对于所有整数a,b,// b == int(a / b)为真吗?
具有整数仿真的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类型
类型对比表
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的方式进行相互之间转换。
-
普通类型赋值
由于
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
. -
字符串创建
- 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] """
- C风格字符串
-
可以通用的类型。
有几种类型是可以直接像C类型一样使用的,如
int
,string
,bytes
,这几种可以和上面几种进行类型对照。能匹配的都可以进行直接使用。 -
自定义类型作为参数。
添加属性
_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`)和整数或布尔数组是有效的索引?
我正在使用 PyTorch 解决 BERT 的文本分类问题。这是我正在使用的 PyTorch 数据集格式,但是当我尝试访问来自数据集的输入时出现错误。
PyTorch 数据集
数据集返回一个包含以下内容的字典:ids
、mask
、token_type_ids
、targets
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 – 如何将列表中的所有整数相乘
> 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]
解决方法
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)
python – 整数除法:对于所有整数a,b,// b == int(a / b)为真吗?
我只是想知道是否有一个整数除法表达式会在Python 2和Python 3中返回相同的结果(是的,我从__future__ import division中知道).
附:我们暂时忽略浮点溢出.
解决方法
>>> 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)为真吗?等更多相关知识的信息可以在本站进行查询。
本文标签: