使用命名元组初始化numpy数组

时间:2014-08-28 15:11:59

标签: python arrays numpy initialization namedtuple

我正在尝试初始化包含命名元组的NumPy数组。当我使用empty数据初始化数组并在之后设置该数据时,一切正常;然而,当使用numpy.array构造函数时,NumPy并没有达到我的预期。

的输出
import numpy

data = numpy.random.rand(10, 3)
print data[0]

# Works
a = numpy.empty(
    len(data),
    dtype=numpy.dtype([('nodes', (float, 3))])
    )
a['nodes'] = data
print
print a[0]['nodes']


# Doesn't work
b = numpy.array(
    data,
    dtype=numpy.dtype([('nodes', (float, 3))])
    )
print
print b[0]['nodes']

[ 0.28711363  0.89643579  0.82386232]

[ 0.28711363  0.89643579  0.82386232]

[[ 0.28711363  0.28711363  0.28711363]
 [ 0.89643579  0.89643579  0.89643579]
 [ 0.82386232  0.82386232  0.82386232]]

这是NumPy 1.8.1。

有关如何组织array构造函数的任何提示?

2 个答案:

答案 0 :(得分:0)

这太糟糕了,但是:

从复制并粘贴到ipython的示例开始,尝试

dtype=numpy.dtype([('nodes', (float, 3))])
c = numpy.array([(aa,) for aa in data], dtype=dtype)

似乎可以解决问题。

答案 1 :(得分:-1)

构建不同的数组具有指导意义:

dt3=np.dtype([('x','<f8'),('y','<f8'),('z','<f8')])
b=np.zeros((10,),dtype=dt3)
b[:]=[tuple(x) for x in data]
b['x'] = data[:,0]  # alt
np.array([tuple(x) for x in data],dtype=dt3) # or in one statement

a[:1] 
# array([([0.32726803375966484, 0.5845638956708634, 0.894278688117277],)], dtype=[('nodes', '<f8', (3,))])
b[:1]
# array([(0.32726803375966484, 0.5845638956708634, 0.894278688117277)], dtype=[('x', '<f8'), ('y', '<f8'), ('z', '<f8')])

我认为没有某种迭代的方法可以datab的所有字段分配genfromtxt


data = list(zip(*[...])) output = np.array(data, dtype) 是生成这样的记录数组的常用方法。看看它的代码,我看到了一个类似的模式:

dtype=numpy.dtype([('nodes', (float, 3))])
a = np.array(zip(data), dtype=dtype)

这激发了我的尝试:

np.array(zip(*data.T), dtype=dt3)

(速度与eickenberg的理解基本相同;所以它进行相同的纯Python列表操作。)

对于3个领域:

zip(data)
好奇地,首先明确转换为列表的速度更快(几乎是np.array(zip(*data.T.tolist()), dtype=dt3) 计算的2倍)

{{1}}
相关问题