如何具有混合类型的numpy数组?

时间:2018-10-11 04:04:54

标签: python numpy

我想用混合类型创建一个numpy数组。我发现的其他SO问题要么创建基于object的数组,要么创建嵌套数组。

我都不想要。

语法看起来如何像一个具有一列str和两列int的numpy数组?

这是我目前的代码:

import numpy as np

b = np.empty((0, 3), )
b = np.insert(b, b.shape[0], [[1, 2, 3]], axis=0)
b = np.insert(b, b.shape[0], [[1, 2, 3]], axis=0)

print(b)
print("---")

a = np.empty((0, 3), dtype='S4, int, int')
a = np.insert(a, a.shape[0], ("a", 2, 3), axis=0)
a = np.insert(a, a.shape[0], ("a", 2, 3), axis=0)

print(a)

输出:

[[1. 2. 3.]
 [1. 2. 3.]]
---
[[(b'a', 2, 3) (b'a', 2, 3) (b'a', 2, 3)]
 [(b'a', 2, 3) (b'a', 2, 3) (b'a', 2, 3)]]

编辑:

对于数组a我需要的是:

[["a" 2 3]
 ["a" 2 3]]

1 个答案:

答案 0 :(得分:1)

您的第二个数组已接近,尽管我会用索引而不是插入(它会更慢)来完成它:

In [431]: a = np.zeros(3, dtype='S4, int, int')
In [432]: a[0] = ('a', 2, 3)
In [433]: a[1] = 1
In [434]: a
Out[434]: 
array([(b'a', 2, 3), (b'1', 1, 1), (b'', 0, 0)],
      dtype=[('f0', 'S4'), ('f1', '<i8'), ('f2', '<i8')])

元组列表也是构造这样的数组的好方法:

In [436]: a = np.array([('a',2,3),('b',4,5)], dtype='S4, int, int')
In [437]: a
Out[437]: 
array([(b'a', 2, 3), (b'b', 4, 5)],
      dtype=[('f0', 'S4'), ('f1', '<i8'), ('f2', '<i8')])

请注意,形状为1d(n,),具有3个字段。字段不计为维度。

通过名称而不是“列”号访问字段:

In [438]: a['f1']
Out[438]: array([2, 4])

您制作了一个(2,3)数组,并用相同的东西填充了每个“行”。这就是为什么您重复的原因,而我却没有。

使用unicode字符串dtype(Py3的默认设置):

In [439]: a = np.array([('a',2,3),('b',4,5)], dtype='U4, int, int')
In [440]: a
Out[440]: 
array([('a', 2, 3), ('b', 4, 5)],
      dtype=[('f0', '<U4'), ('f1', '<i8'), ('f2', '<i8')])
In [441]: print(a)
[('a', 2, 3) ('b', 4, 5)]