1

我正在尝试初始化一个包含命名元组的 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构造函数的任何提示?

4

2 回答 2

0

这很糟糕,但是:

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

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

它似乎可以解决问题。

于 2014-08-28T18:13:02.653 回答
-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')])

我认为没有一种方法可以在没有某种迭代的情况下分配data给所有字段。b


genfromtxt是生成这样的记录数组的常用方法。查看它的代码,我看到如下模式:

data = list(zip(*[...]))
output = np.array(data, dtype)

这启发了我尝试:

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

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

对于 3 个字段:

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

奇怪的是,显式转换为 list first 甚至更快(几乎是zip(data)calc 的 2 倍)

np.array(zip(*data.T.tolist()), dtype=dt3)
于 2014-08-29T07:34:26.220 回答