我有一个元组列表,其中一个是对象,另一个是通用的。当我运行
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 不起作用。
使用这个元组列表,您可以创建 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 个整数。
对象数组。这是带有元组内容的一维。内容可以是其他任何内容。这是一个增强/降低的列表。
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)
做了同样的事情。除了整数、浮点数、字符串等之外的任何东西都会“转换”为“对象”。
简单地指定对象数据类型没有帮助。结果是带有数字元素的 2d(但存储为对象指针)。
In [429]: np.array(a, dtype=object)
Out[429]:
array([[1, 2],
[3, 4]], dtype=object)
In [430]: _.shape
Out[430]: (2, 2)
有关创建对象数据类型数组的更多信息,请访问
简而言之
如果你有一个类似元组的元组列表(
str
,tuple
):
tuples = [('a', (-2.56, -1.79)),
('b', (-1.79, -1.02)),
('c', (-1.02, -0.26)),
('d', (-0.26, 0.51)),
('e', (0.51, 1.28))]
并且想要创建一维元组数组,请使用
dtype
将元组描述为 object
序列:
a = np.array(tuples, dtype='object, object')
一维数组将具有
void
类型,但元素将是元组,并为其自己的元素保留类型:
a[n].
--> 输入 numpy.void
a[n][0]
--> 输入 str
a[n][1]
--> 输入 tuple
恢复初始列表:
print(list(a))
[('a', (-2.56, -1.79)),
('b', (-1.79, -1.02)),
('c', (-1.02, -0.26)),
('d', (-0.26, 0.51)),
('e', (0.51, 1.28))]
实验
import numpy as np
tuples = [('a', (-2.56, -1.79)),
('b', (-1.79, -1.02)),
('c', (-1.02, -0.26)),
('d', (-0.26, 0.51)),
('e', (0.51, 1.28))]
a = np.array(tuples, dtype='object, object')
print(f'a shape: {a.shape}')
print(f'a dtype: {a.dtype}')
i = 3
t = a[i]
print(f'a[{i}]: {t}, type: {type(t)}')
for e in t:
print(f'Type of {e}: {type(e)}')
a shape: (5,)
a dtype: [('f0', 'O'), ('f1', 'O')]
a[3]: ('d', (-0.26, 0.51)), type: <class 'numpy.void'>
Type of d: <class 'str'>
Type of (-0.26, 0.51): <class 'tuple'>