【问题标题】:How to create numpy.ndarray from tuple iteration如何从元组迭代创建 numpy.ndarray
【发布时间】:2014-06-30 03:22:03
【问题描述】:

我有以下循环

# `results` are obtained from some mySQldb command.

for row in results:
    print row

像这样打印元组:

('1A34', 'RBP', 0.0, 1.0, 0.0, 0.0, 0.0, 0.0)
('1A9N', 'RBP', 0.0456267, 0.0539268, 0.331932, 0.0464031, 4.41336e-06, 0.522107)
('1AQ3', 'RBP', 0.0444479, 0.201112, 0.268581, 0.0049757, 1.28505e-12, 0.480883)
('1AQ4', 'RBP', 0.0177232, 0.363746, 0.308995, 0.00169861, 0.0, 0.307837)

我的问题来自那个迭代,我如何才能创建一个看起来像这样的颠簸 nd.array:

array([['1A34', 'RBP', 0.0, 1.0, 0.0, 0.0, 0.0, 0.0],
       ['1A9N', 'RBP', 0.0456267, 0.0539268, 0.331932, 0.0464031, 4.41336e-06, 0.522107],
       ['1AQ3', 'RBP', 0.0444479, 0.201112, 0.268581, 0.0049757, 1.28505e-12, 0.480883],
       ['1AQ4', 'RBP', 0.0177232, 0.363746, 0.308995, 0.00169861, 0.0, 0.307837]])

最后,ndarray 将具有形状:(4,8)

【问题讨论】:

  • 您需要将strfloat 放在一个array 中吗?可以通过structured array 完成,但这不是理想的解决方案。普通数组只允许一种类型(众所周知的dtype)。考虑使用pandas
  • 如果results 是生成器,则需要先将其转换为列表。原因是 numpy 数组需要在创建时知道它们的大小。如果您知道results 中的元素数量,则可以执行a = numpy.empty((n, 8), dtype='object') 之类的操作,然后是:for i, row in enumerate(results): a[i] = row
  • @AlokSinghal,不完全正确,有一个numpy.fromiter函数。
  • @CTZhu 感谢您提到这一点。尽管fromiter 似乎会为每个新元素重新分配数组,除非指定了count编辑:刚刚查看了源代码,它似乎在每次新分配时都有 50% 的增长,所以它可能没有我想象的那么糟糕。

标签: python numpy multidimensional-array


【解决方案1】:

将其读入结构化数组:

In [30]:
a=[('1A34', 'RBP', 0.0, 1.0, 0.0, 0.0, 0.0, 0.0),
   ('1A9N', 'RBP', 0.0456267, 0.0539268, 0.331932, 0.0464031, 4.41336e-06, 0.522107),
   ('1AQ3', 'RBP', 0.0444479, 0.201112, 0.268581, 0.0049757, 1.28505e-12, 0.480883),
   ('1AQ4', 'RBP', 0.0177232, 0.363746, 0.308995, 0.00169861, 0.0, 0.307837)]
np.array(a, dtype=('a10,a10,f4,f4,f4,f4,f4,f4'))
Out[30]:
array([('1A34', 'RBP', 0.0, 1.0, 0.0, 0.0, 0.0, 0.0),
       ('1A9N', 'RBP', 0.045626699924468994, 0.053926799446344376, 0.331932008266449, 0.04640309885144234, 4.413359874888556e-06, 0.5221070051193237),
       ('1AQ3', 'RBP', 0.044447898864746094, 0.20111200213432312, 0.26858100295066833, 0.004975699819624424, 1.2850499744171406e-12, 0.48088300228118896),
       ('1AQ4', 'RBP', 0.01772320084273815, 0.3637459874153137, 0.30899500846862793, 0.0016986100235953927, 0.0, 0.30783700942993164)], 
      dtype=[('f0', 'S10'), ('f1', 'S10'), ('f2', '<f4'), ('f3', '<f4'), ('f4', '<f4'), ('f5', '<f4'), ('f6', '<f4'), ('f7', '<f4')])

您可以在objectdtype中拥有所有这些:

In [46]:

np.array(a, dtype=object)
Out[46]:
array([['1A34', 'RBP', 0.0, 1.0, 0.0, 0.0, 0.0, 0.0],
       ['1A9N', 'RBP', 0.0456267, 0.0539268, 0.331932, 0.0464031,
        4.41336e-06, 0.522107],
       ['1AQ3', 'RBP', 0.0444479, 0.201112, 0.268581, 0.0049757,
        1.28505e-12, 0.480883],
       ['1AQ4', 'RBP', 0.0177232, 0.363746, 0.308995, 0.00169861, 0.0,
        0.307837]], dtype=object)

但它对于float 值并不理想,也可能导致不良行为:

In [48]:
b=np.array(a, dtype=object)
b[0]+b[1] #addition for float values and concatenation for string values
Out[48]:
array(['1A341A9N', 'RBPRBP', 0.0456267, 1.0539268, 0.331932, 0.0464031,
       4.41336e-06, 0.522107], dtype=object)

pandas 也是一种选择:

In [43]:
import pandas as pd
print pd.DataFrame(a)
      0    1         2         3         4         5             6         7
0  1A34  RBP  0.000000  1.000000  0.000000  0.000000  0.000000e+00  0.000000
1  1A9N  RBP  0.045627  0.053927  0.331932  0.046403  4.413360e-06  0.522107
2  1AQ3  RBP  0.044448  0.201112  0.268581  0.004976  1.285050e-12  0.480883
3  1AQ4  RBP  0.017723  0.363746  0.308995  0.001699  0.000000e+00  0.307837
In [44]:

pd.DataFrame(a).dtypes
Out[44]:
0     object
1     object
2    float64
3    float64
4    float64
5    float64
6    float64
7    float64
dtype: object

它允许列有不同的dtype

【讨论】:

  • 感谢熊猫的建议。但我需要 scikit-learn 要求的 numpy。
  • 不客气,在这种情况下,我建议将字符串值编码为虚拟变量或因子(0、1、2、3...),这样每件事都可以放入普通的@ 987654330@arrayfloatdtype
  • undesired behaviour 仅适用于object 数据类型吗?如果我使用您的建议 dtype=[('f0', 'S10'), ('f1', 'S10'), ('f2', '&lt;f4'), ('f3', '&lt;f4'), ('f4', '&lt;f4'), ('f5', '&lt;f4'), ('f6', '&lt;f4'), ('f7', '&lt;f4')]) 进行硬编码,那么应该不会出现这种副作用吧?
  • 顺便说一下,形状是(4,) 而不是(4,8)。我怎样才能正确地获得后一种形状?
  • 是的,一旦你在structured array 中有数据,形状就会变成(4,)8 消失了(取而代之的是 8 字段,f0f7)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-13
  • 2019-06-06
  • 2019-08-15
  • 1970-01-01
  • 2018-05-20
  • 1970-01-01
  • 2013-01-21
相关资源
最近更新 更多