Python 混合类型的NumPy数组/矩阵
我正在尝试创建一个混合数据类型(字符串、整数、整数)的NumPy数组/矩阵(Nx3)。但是当我通过添加一些数据来追加这个矩阵时,我得到一个错误:TypeError:invalid type promotion。请问,有人能帮我解决这个问题吗 使用示例数据创建数组时,NumPy将矩阵中的所有列强制转换为“S”数据类型。我不能为数组指定数据类型,因为当我这样做时,res=np.array([“TEXT”,1,1],dtype='S,i4,i4')-我得到一个错误:TypeError:需要一个可读的缓冲区对象 模板.pyPython 混合类型的NumPy数组/矩阵,python,arrays,numpy,matrix,Python,Arrays,Numpy,Matrix,我正在尝试创建一个混合数据类型(字符串、整数、整数)的NumPy数组/矩阵(Nx3)。但是当我通过添加一些数据来追加这个矩阵时,我得到一个错误:TypeError:invalid type promotion。请问,有人能帮我解决这个问题吗 使用示例数据创建数组时,NumPy将矩阵中的所有列强制转换为“S”数据类型。我不能为数组指定数据类型,因为当我这样做时,res=np.array([“TEXT”,1,1],dtype='S,i4,i4')-我得到一个错误:TypeError:需要一个可读的缓
import numpy as np
from pprint import pprint
test_array = np.zeros((0, 3), dtype='S, i4, i4')
pprint(test_array)
test_array = np.append(test_array, [["TEXT", 1, 1]], axis=0)
pprint(test_array)
print("Array example:")
res = np.array(["TEXT", 1, 1])
pprint(res)
输出:
array([], shape=(0L, 3L),
dtype=[('f0', 'S'), ('f1', '<i4'), ('f2', '<i4')])
Array example:
array(['TEXT', '1', '1'], dtype='|S4')
Traceback (most recent call last):
File "templates.py", line 5, in <module>
test_array = np.append(test_array, [["TEXT", 1, 1]], axis=0)
File "lib\site-packages\numpy\lib\function_base.py", line 3543, in append
return concatenate((arr, values), axis=axis)
TypeError: invalid type promotion
数组([],形状=(0L,3L),
dtype=[('f0','S'),('f1','我不相信你可以用一种以上的数据类型来创建一个数组。但是,你可以用一种以上的数据类型来创建一个列表
list = ["TEXT", 1, 1]
print(list)
给予
您的问题在数据中。请尝试以下操作:
res = np.array(("TEXT", 1, 1), dtype='|S4, i4, i4')
或
数据必须是一个元组或元组列表。从错误消息中不太明显,是吗
另外,请注意,要真正保存文本数据,必须指定文本字段的长度。如果要将文本保存为对象(仅引用数组中的引用),则:
res = np.array([("TEXT", 1, 1), ("XXX", 2, 2)], dtype='object, i4, i4')
这通常也是非常有用的。首先,numpy使用固定的物理记录大小存储数组元素。因此,记录对象的物理大小必须相同。因此,您需要告诉numpy字符串的大小或保存指向存储在其他位置的字符串的指针。在记录数组中,“S”转换为零长度str这可能不是你想要的
append方法实际上将整个数组复制到更大的物理空间以容纳新元素。请尝试,例如:
import numpy as np
mtype = 'S10, i4, i4'
ta = np.zeros((0), dtype=mtype)
print id(ta)
ta = np.append(ta, np.array([('first', 10, 11)], dtype=mtype))
print id(ta)
ta = np.append(ta, np.array([('second', 20, 21)], dtype=mtype))
print id(ta)
每次以这种方式追加时,副本速度都会变慢,因为每次追加时都需要分配和复制更多内存。这就是为什么每次追加时id都会返回不同的值。如果希望数组中有大量记录,最好从一开始就分配足够的空间,或者从一开始就累积足够的内存在列表中添加数据,然后在完成后将列表收集到numpy结构化数组中。这也让您有机会使mtype中的字符串长度尽可能短,同时仍然足够长以容纳最长的字符串。如果您没有与numpy结婚,则a非常适合。
或者,您可以将数组中的字符串字段指定为python对象(例如,dtype='O,i4,i4'。另外,append似乎喜欢元组列表,而不是列表列表。我认为这与列表的易变性有关,不确定。我认为这就是您试图实现的目标-创建所需的dtype
的空数组,然后向其中添加一个或多个数据集。结果将具有形状(N,),而不是(N,3)
正如我在一篇评论中指出的,np.append
使用np.concatenate
,所以我也在使用它。我还必须使test\u数组和x
1d数组(分别是形状(0,)和(1,)。dtype
字段是S10
,大到足以包含“文本”
In [56]: test_array = np.zeros((0,), dtype='S10, i4, i4')
In [57]: x = np.array([("TEST",1,1)], dtype='S10, i4, i4')
In [58]: test_array = np.concatenate((test_array, x))
In [59]: test_array = np.concatenate((test_array, x))
In [60]: test_array
Out[60]:
array([('TEST', 1, 1), ('TEST', 1, 1)],
dtype=[('f0', 'S'), ('f1', '<i4'), ('f2', '<i4')])
[56]中的:test_array=np.zeros((0,),dtype='S10,i4,i4')
在[57]中,x=np.array([(“TEST”,1,1)],dtype='S10,i4,i4')
[58]中:test_数组=np.concatenate((test_数组,x))
在[59]中:test_数组=np.concatenate((test_数组,x))
In[60]:test_数组
出[60]:
数组([('TEST',1,1),('TEST',1,1)],
数据类型=[('f0','S'),('f1',我需要使用NumPy来实现这一点,因为我以后会使用一些特定的NumPy方法,使用这些数据。OP确实使用dtype
创建了一个包含多个数据类型的数组。我认为不必有元组。它给出了一个错误:ValueError:所有输入数组必须具有相同的维数。您将看到元组如果您尝试np.array((“TEXT”,1,1),dtype='S,i4,i4')
与np.array([“TEXT”,1,1],dtype='S,i4,i4')
相比,de>是必需的
生成一个包含0个“行”和3个名为“列”的数组。它实际上是一个1d数组。一般来说,在numpy
中,通过追加来构建数组不是一个好主意。最好是追加到列表中,然后从列表中构建数组。或者从一个足够大的“空”数组开始,然后插入值。或者连接数组。我刚刚看了append
code。它实际上使用了连接
。尝试创建一个包含“文本”数据的数组,并将其连接到测试数组
。
import numpy as np
mtype = 'S10, i4, i4'
ta = np.zeros((0), dtype=mtype)
print id(ta)
ta = np.append(ta, np.array([('first', 10, 11)], dtype=mtype))
print id(ta)
ta = np.append(ta, np.array([('second', 20, 21)], dtype=mtype))
print id(ta)
In [56]: test_array = np.zeros((0,), dtype='S10, i4, i4')
In [57]: x = np.array([("TEST",1,1)], dtype='S10, i4, i4')
In [58]: test_array = np.concatenate((test_array, x))
In [59]: test_array = np.concatenate((test_array, x))
In [60]: test_array
Out[60]:
array([('TEST', 1, 1), ('TEST', 1, 1)],
dtype=[('f0', 'S'), ('f1', '<i4'), ('f2', '<i4')])
In [75]: xl=('test',1,1)
In [76]: np.array([xl]*3,dtype='S10,i4,i4')
Out[76]:
array([('test', 1, 1), ('test', 1, 1), ('test', 1, 1)],
dtype=[('f0', 'S10'), ('f1', '<i4'), ('f2', '<i4')])