转换为numpy数组的元组列表

时间:2017-10-04 15:49:11

标签: python list numpy tuples

我有一个元组列表,其中一个是对象,另一个是通用的。当我运行np.asarray(list_in)时,结果是一个2D数组,元组被连续转换。但是我想获得一个由元组组成的一维阵列。

我可以传递一个dtype强制它,如果我尝试这个简约的例子,它会运作良好

a = [(1,2),(3,4)]
b = np.asarray(a,dtype=('float,float'))
print b
[( 1.,  2.) ( 3.,  4.)]

但是我如何获取列表的第一个元素并从中构造一个正确的dtypetype(list_in[0])返回tuple并将其传递给asarray不起作用。

1 个答案:

答案 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数组的更多信息

numpy ravel on inconsistent dimensional object