我有一个元组列表,其中一个是对象,另一个是通用的。当我运行np.asarray(list_in)
时,结果是一个2D数组,元组被连续转换。但是我想获得一个由元组组成的一维阵列。
我可以传递一个dtype
强制它,如果我尝试这个简约的例子,它会运作良好
a = [(1,2),(3,4)]
b = np.asarray(a,dtype=('float,float'))
print b
[( 1., 2.) ( 3., 4.)]
但是我如何获取列表的第一个元素并从中构造一个正确的dtype
。 type(list_in[0])
返回tuple
并将其传递给asarray不起作用。
答案 0 :(得分:2)
使用这个元组列表,你可以制作3种数组:
In [420]: a = [(1,2),(3,4)]
2d数组,从输入推断出dtype(但也可以像float一样指定)。输入大小匹配。
In [421]: np.array(a)
Out[421]:
array([[1, 2],
[3, 4]])
结构化数组。 1d有2个字段。按名称进行字段索引。输入必须是元组列表(不是列表列表):
In [422]: np.array(a, dtype='i,i')
Out[422]:
array([(1, 2), (3, 4)],
dtype=[('f0', '<i4'), ('f1', '<i4')])
In [423]: _['f0']
Out[423]: array([1, 3], dtype=int32)
在结构化数组中,输入和显示使用元组,但数据实际上并不存储为元组。这些值打包为字节 - 在本例中为8个字节,代表2个整数。
对象数组。这是元组内容的1d。内容可能是其他任何东西。这是一个增强/贬值的列表。
In [424]: A = np.empty((2,), dtype=object)
In [425]: A[:] = a
In [426]: A
Out[426]: array([(1, 2), (3, 4)], dtype=object)
In [427]: A.shape
Out[427]: (2,)
In [428]: A[1]
Out[428]: (3, 4)
Out[428]
是一个实际的元组。试图修改它A[1][0]=30
会引发错误。
在最后一种情况下,A = np.empty(2, dtype=tuple)
做同样的事情。除了整数,浮点数,字符串等之外的任何东西都被转换为&#39; “对象&#39;。
简单地指定对象dtype并没有帮助。结果是2d的数字元素(但存储为对象指针)。
In [429]: np.array(a, dtype=object)
Out[429]:
array([[1, 2],
[3, 4]], dtype=object)
In [430]: _.shape
Out[430]: (2, 2)
有关在
处制作对象dtype数组的更多信息