【问题标题】:List of tuples converted to numpy array转换为 numpy 数组的元组列表
【发布时间】:2018-03-16 02:20:18
【问题描述】:

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

我可以传递一个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 不起作用。

【问题讨论】:

  • 什么是 proper dtype ?为什么你没有得到你所期待的——你期待是什么?
  • 我假设您希望 dtype 是每个元素的类型的元组?
  • 可以说是(MyObject,float),但也可以是(MyObject,anotherObject)。它被编码在列表的第一个元素中
  • np.array(a, dtype=tuple(type(x) for x in a[0])) 是您要找的吗?
  • @cᴏʟᴅsᴘᴇᴇᴅ 是的,没错

标签: python list numpy tuples


【解决方案1】:

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

In [420]: a = [(1,2),(3,4)]

二维数组,从输入中推断出 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) 做同样的事情。整数、浮点数、字符串等以外的任何东西都被“转换”为“对象”。

仅指定对象 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

【讨论】:

  • 谢谢。这实际上有效。 numpy 表现得这么奇怪有点奇怪
  • @RaduIonescu, numpy 主要是一个多维数值数组工具。 Python 已经处理了不同对象的列表,例如元组。 numpy 对象数组不会增加太多的计算能力(如果有的话)。
  • 问题是我在执行一些切片后转换回列表并希望保留输入列表的类型
  • @RaduIonescu,您可能需要提出一个新问题,详细了解您如何处理此列表/数组。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-28
  • 2018-05-03
  • 1970-01-01
  • 2017-03-08
  • 2019-08-30
  • 1970-01-01
  • 2021-06-09
相关资源
最近更新 更多