转换为 numpy 数组的元组列表

Rad*_*scu 2 python tuples numpy list

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

我可以通过 adtype来强制它,如果我尝试这个简约的例子,它会很好地工作

a = [(1,2),(3,4)]
b = np.asarray(a,dtype=('float,float'))
print b
[( 1.,  2.) ( 3.,  4.)]
Run Code Online (Sandbox Code Playgroud)

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

hpa*_*ulj 7

通过这个元组列表,您可以创建 3 种数组:

In [420]: a = [(1,2),(3,4)]
Run Code Online (Sandbox Code Playgroud)

二维数组,具有从输入推断的 dtype(但也可以指定为 float 之类的东西)。输入大小匹配。

In [421]: np.array(a)
Out[421]: 
array([[1, 2],
       [3, 4]])
Run Code Online (Sandbox Code Playgroud)

结构化数组。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)
Run Code Online (Sandbox Code Playgroud)

在结构化数组中,输入和显示使用元组,但数据实际上并不存储为元组。这些值被打包为字节 - 在本例中 8 个字节代表 2 个整数。

对象数组。这是带有元组内容的一维。内容可以是其他任何内容。这是一个增强/降低的列表。

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)
Run Code Online (Sandbox Code Playgroud)

Out[428]是一个实际的元组。尝试修改它A[1][0]=30会引发错误。

在最后一种情况下,A = np.empty(2, dtype=tuple)做同样的事情。除了整数、浮点数、字符串等之外的任何东西都会“转换”为“对象”。

简单地指定对象数据类型没有帮助。结果是带有数字元素的 2d(但存储为对象指针)。

In [429]: np.array(a, dtype=object)
Out[429]: 
array([[1, 2],
       [3, 4]], dtype=object)
In [430]: _.shape
Out[430]: (2, 2)
Run Code Online (Sandbox Code Playgroud)

有关创建对象数据类型数组的更多信息,请访问

numpy ravel 对不一致的维度对象