Python 追加到numpy数组中的特定行

Python 追加到numpy数组中的特定行,python,numpy,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仍然保持为空。 但是,我可以使用以下列表来完成此操

我试图在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中的数组切片来解决这个问题

要对数组执行相同的操作,您必须创建一个对象数据类型数组,并使用
[]
对其进行初始化

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], []]
在对象数组上迭代比在列表上迭代要慢一点(但比在2d数组的行上迭代要快)

使用二维数字数组执行类似操作:

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]])
这将更快,但结果不是一个参差不齐的数组

使用数组无法(准确地)更快地处理列表。它不适合具有许多快速编译构建块的多维数组模型



你询问
map
。这在功能和速度上类似于列表理解。它生成一个新的列表。它不应该用于副作用,比如在现有列表中添加值。

要对数组执行相同的操作,你必须创建一个对象数据类型数组,并用
[]
对其进行初始化

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], []]
在对象数组上迭代比在列表上迭代要慢一点(但比在2d数组的行上迭代要快)

使用二维数字数组执行类似操作:

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]])
这将更快,但结果不是一个参差不齐的数组

使用数组无法(准确地)更快地处理列表。它不适合具有许多快速编译构建块的多维数组模型



您询问有关
map
。这在功能和速度上类似于列表理解。它生成一个新的列表。它不应该用于副作用,例如将值附加到现有列表中。

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

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

您不想这样做吗处理锯齿状numpy数组。你想用它做什么?我试图用列表或锯齿状numpy数组的列表来存储神经元的放电时间,每个子列表表示一个神经元,子列表中的元素表示该特定神经元的放电时间。如果我只是坚持列表列表?如果你想使用numpy,我会将数组初始化为比你预期需要的更大的值。然后你可以边填边填。理想情况下,如果你想加快进程,你会一次添加所有数据,而不是以增量添加。真实数据的实际形状是什么w总行数很多,每行的最小/最大/平均元素数是多少?你不想处理锯齿状numpy数组。你想用它做什么?我试图用列表或锯齿状numpy数组存储神经元的放电时间,每个子列表表示一个神经元,子列表中的元素表示特定神经元的firing times.you thin如果我坚持使用列表列表,我可以在这里使用
map
附加到特定的列表中吗?如果你想使用numpy,我会将数组
onspiketimes
初始化为比你预期需要大的值。然后你可以边走边填充。理想情况下,你可以一次添加所有数据,而不是一次添加如果希望加快处理速度,则递增。实际数据的实际形状是什么?总共有多少行,以及每行的最小/最大/平均元素数是多少?