Python 混合类型的NumPy数组/矩阵

Python 混合类型的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:需要一个可读的缓

我正在尝试创建一个混合数据类型(字符串、整数、整数)的NumPy数组/矩阵(Nx3)。但是当我通过添加一些数据来追加这个矩阵时,我得到一个错误:TypeError:invalid type promotion。请问,有人能帮我解决这个问题吗

使用示例数据创建数组时,NumPy将矩阵中的所有列强制转换为“S”数据类型。我不能为数组指定数据类型,因为当我这样做时,res=np.array([“TEXT”,1,1],dtype='S,i4,i4')-我得到一个错误:TypeError:需要一个可读的缓冲区对象

模板.py

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')])