我正在尝试初始化包含命名元组的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
构造函数的任何提示?
答案 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')])
我认为没有某种迭代的方法可以data
为b
的所有字段分配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}}