0

我有一个数组定义为 -

import numpy as np
A = np.recarray((3,),dtype=[('x',float), ('y', float), ('z',float)])

加上另一个从 CSV 文件中读取的数组 B -

>>> print B
[(7.0, 0.0, 7.0) (16.0, 0.0, 1.0)]

当我尝试将元素添加到数组时,如下所示 -

for i in range(B.size):
    if(B[i][0] != 0.):
        A.append((0.,B[i][1],B[i][2]))
    if(B[i][1] != 0.):
        A.append((B[i][0],0.,B[i][2]))
    if(B[i][2] != 0.):
        A.append((B[i][0],B[i][1],0.))

我收到如下错误 -

File "/usr/lib/python2.7/dist-packages/numpy/core/records.py", line 416, in __getattribute__
    raise AttributeError, "record array has no attribute %s" % attr
    AttributeError: record array has no attribute append

我无法理解这个字符串属性 (%s) 在哪里出现?

有人可以帮忙吗?

更新: 我将代码更改为np.append(A,(0.,B[i][1],B[i][2])),但是我收到另一个错误 -TypeError: invalid type promotion

4

2 回答 2

1

该错误只是说recarray没有任何称为append的方法。

我还没有真正使用过 numpy,但一种解决方案可能是将 A 转换为列表

A.tolist()

将记录附加到此列表,然后执行类似的操作

np.fromiter(x, A.dtype)

得到新的rearray。当然,这看起来不是一个好的解决方案。

也许更熟悉 numpy 的人将能够参与并改进它。

于 2012-10-12T09:49:19.100 回答
1

附加到 numpy 数组是一个缓慢的操作,因为必须分配新内存并且必须复制整个数组。对每一行都这样做B是低效的。如果可以,请避免这种情况。

如果您事先知道和的形状Aminors(B)见下文),最好从一开始就制作一个足够大的数组以容纳两者。

有很多是按照你的要求去做的。@seberg 的np.lib.recfunctions.stack_arrays想法将成为一个可行的解决方案,只要 dtypesAB是相同的。

这是另一种可能性,即使B具有不同的 dtype,或者只是一个 ndarray 或列表列表,它也可以工作。

import itertools
import numpy as np

def minors(arr):
    for row in arr:
        row = list(row)
        for i, elt in enumerate(row):
            if elt != 0:
                for val in row[:i]+[0]+row[i+1:]:
                    yield val

A = np.recarray((3,),dtype=[('x',float), ('y', float), ('z',float)])
B = [(7.0, 0.0, 7.0), (16.0, 0.0, 1.0)]

C = np.fromiter(itertools.chain(A.view(float), minors(B)), dtype = float)
C = C.view(A.dtype)
于 2012-10-12T11:31:54.637 回答