python - 用于分配数组元素的 Numpy 语法

标签 python arrays numpy

我想创建一个数组,其元素是其位置的函数。 类似的东西

N = 1000000 
newarray = np.zeros([N,N,N])
for i in range(N):
    for j in range(N):
        for k in range(N):
            newarray[i,j,k] = f(i,j,k)

有没有办法通过删除 for 循环/使用 numpy 语法并行化来提高此操作的速度?

这是 f 函数

def f(i,j,k): 索引 = (R[:,0]==i) *( R[:,1]==j) * (R[:,2]==k) 返回 M[索引]

例如在哪里

R = np.random.randint(0,N,[N,3]) M = np.random.randn(N)*15

并且在实际应用中它们并不是随机的。

最佳答案

您可以使用 at 执行该操作方法np.add :

import numpy as np

np.random.seed(0)
N = 100
R = np.random.randint(0, N, [N, 3])
M = np.random.randn(N) * 15
newarray = np.zeros([N, N, N])
np.add.at(newarray, (R[:, 0], R[:, 1], R[:, 2]), M)

在这种情况下,如果R有任何重复的行,则newarray中的相应值将是M中所有相应值的总和.

编辑:要取平均值而不是重复元素的总和,您可以执行以下操作:

import numpy as np

np.random.seed(0)
N = 100
R = np.random.randint(0, N, [N, 3])
M = np.random.randn(N) * 15
newarray = np.zeros([N, N, N])
np.add.at(newarray, (R[:, 0], R[:, 1], R[:, 2]), M)
newarray_count = np.zeros([N, N, N])
np.add.at(newarray_count, (R[:, 0], R[:, 1], R[:, 2]), 1)
m = newarray_count > 1
newarray[m] /= newarray_count[m]

关于python - 用于分配数组元素的 Numpy 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56238202/

相关文章:

python - 使用 Python 在 SQLite 数据库中插入二进制文件

python - 从单元格中删除字符并在 python pandas 中将剩余的 float 除以 2

php - 将 Python 片段转换为 PHP?

python - pyodbc 中的字符串参数

python - 使用键数组根据第一个元素按顺序拉取元素

javascript - JS中对象的频率排序数组,如果频率匹配则根据对象属性排序

java - 坚持通过不硬编码数组大小来创建 Java 数组

javascript - 将字符串数组转换为一个数组JS

python - 将 numpy 数组作为变量添加到 Xarray 数据集

python - numpy 对每一行进行排序并检索第 k 个元素