转换为 numpy 数组的元组列表

问题描述 投票:0回答:2

我有一个元组列表,其中一个是对象,另一个是通用的。当我运行

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 不起作用。

python list numpy tuples
2个回答
7
投票

使用这个元组列表,您可以创建 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)

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

numpy 对不一致维度对象的解析


0
投票

简而言之

如果你有一个类似元组的元组列表(

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'>
© www.soinside.com 2019 - 2024. All rights reserved.