追加到numpy数组中的特定行

时间:2018-08-10 23:07:35

标签: python numpy

我正在尝试将数字附加到2D numpy数组的特定行。我做了以下操作,但无法正常工作:

onspiketimes=np.array([[] for i in range(9)])
neurs = [3, 4, 8, 2]
onspiketimes[neurs]=2
>>> onspiketimes
array([], shape=(9, 0), dtype=float64)

如您所见,没有附加任何内容,onspiketimes仍然为空。 但是,我可以使用以下列表列表来做到这一点:

>>> onspiketimes= [[] for i in range(9)]
>>> for items in neurs:
        onspiketimes[items].append(2)
>>> for items in neurs:
        onspiketimes[items].append(3)
>>> onspiketimes
[[], [], [2, 3], [2, 3], [2, 3], [], [], [], [2, 3]]

这是一个人为的示例,在这里我无法真正比​​较numpy和列表,但是在我的实际应用程序中,for循环确实会影响加速。我希望在numpy中使用数组切片解决此问题。

2 个答案:

答案 0 :(得分:1)

要对数组执行相同的操作,必须创建一个对象dtype数组,并使用<ion-tabs tabsPlacement="top"> <ion-tab [root]="tab1Root" tabTitle="Home" tabIcon="home"></ion-tab> <ion-tab [root]="tab2Root" tabTitle="About" tabIcon="information-circle"></ion-tab> <ion-tab [root]="tab3Root" tabTitle="Contact" tabIcon="contacts"></ion-tab> </ion-tabs> 对其进行初始化。

[]

在对象数组上进行迭代比在列表上进行迭代要慢一些(但比在2d数组的行上进行迭代要快。

对二维数值数组执行类似操作:

In [580]: alist = [[] for _ in range(10)]
In [581]: arr = np.empty(10, object)
In [582]: arr[:]= alist
In [583]: arr
Out[583]: 
array([list([]), list([]), list([]), list([]), list([]), list([]),
       list([]), list([]), list([]), list([])], dtype=object)
In [584]: neurs = [3, 4, 8, 2]
In [585]: for item in neurs:
     ...:     arr[item].append(2)
     ...:     
In [586]: for item in neurs:
     ...:     arr[item].append(3)
     ...:     
In [587]: 
In [587]: arr
Out[587]: 
array([list([]), list([]), list([2, 3]), list([2, 3]), list([2, 3]),
       list([]), list([]), list([]), list([2, 3]), list([])], dtype=object)

In [588]: arr.tolist()
Out[588]: [[], [], [2, 3], [2, 3], [2, 3], [], [], [], [2, 3], []]

这会更快,但结果不是数组参差不齐。

使用数组无法(完全)更快地完成列表操作。它不适合具有许多快速编译的构建基块的多维数组模型。


您询问In [589]: arr2 = np.zeros((10,5),int) In [590]: arr2[neurs, 0] = 2 In [591]: arr2[neurs, 1] = 3 In [592]: arr2 Out[592]: array([[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [2, 3, 0, 0, 0], [2, 3, 0, 0, 0], [2, 3, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [2, 3, 0, 0, 0], [0, 0, 0, 0, 0]]) 。在功能和速度上,这类似于列表理解。它将产生一个新列表。不应将其用于副作用,例如将值追加到现有列表中。

答案 1 :(得分:1)

NumPy数组存储在连续的内存块中,因此按照您所描述的方式将新元素追加到数组中将需要分配一个更大的新内存块,复制数组中的现有元素,并构造新的,修改后的数组。这是低效率的并且是不希望的。对于您要在示例中尝试执行的操作,列表列表比NumPy数组要好得多。