Python 在numpy数组中赋值
我有一个由零组成的numpy数组。对于具体度,假设为2x3x4:Python 在numpy数组中赋值,python,arrays,numpy,variable-assignment,Python,Arrays,Numpy,Variable Assignment,我有一个由零组成的numpy数组。对于具体度,假设为2x3x4: x = np.zeros((2,3,4)) 假设我有一个2x3的随机整数数组,从0到3(x的第三维索引) 我如何有效地完成以下赋值(编辑:不用于循环,但适用于任意数量的维度和每个维度中任意数量的元素的x) 谢谢, 詹姆斯 将产生预期的结果,IIRC。如果数组维度不变,考虑用“/p>替换两个循环和它们的负担”。 for j in range(3): x[0,j,y[0,j]] = x[1,j,y[1,j]] = 1 目前
x = np.zeros((2,3,4))
假设我有一个2x3的随机整数数组,从0到3(x的第三维索引)
我如何有效地完成以下赋值(编辑:不用于循环,但适用于任意数量的维度和每个维度中任意数量的元素的x)
谢谢,
詹姆斯
将产生预期的结果,IIRC。如果数组维度不变,考虑用“/p>替换两个循环和它们的负担”。
for j in range(3):
x[0,j,y[0,j]] = x[1,j,y[1,j]] = 1
目前,我只能想到“简单”版本,它涉及沿前两个维度展平。此代码应适用于:
shape_last = x.shape[-1]
x.reshape((-1, shape_last))[np.arange(y.size), y.flatten()] = 1
这将产生(我随机生成的y
):
关键是,如果使用多个numpy数组()进行索引,numpy将使用索引对索引到数组中
当然,要确保x
和y
都是C-order或F-order,否则,调用重塑
和展平
可能会给出不同的顺序。使用()创建索引数组,您可以使用它来索引到原始数组和第三维的值数组中
import numpy as np
import scipy as sp
import scipy.stats.distributions
a = np.zeros((2,3,4))
z = sp.stats.distributions.randint.rvs(0, 4, size=(2,3))
xx, yy = np.meshgrid( np.arange(2), np.arange(3) )
a[ xx, yy, z[xx, yy] ] = 1
print a
为了清晰起见,我将数组从x重命名为a,将索引数组从y重命名为z
编辑:4D示例:
a = np.zeros((2,3,4,5))
z = sp.stats.distributions.randint.rvs(0, 4, size=(2,3))
w = sp.stats.distributions.randint.rvs(0, 5, size=(2,3))
xx, yy = np.meshgrid( np.arange(2), np.arange(3) )
a[ xx, yy, z[xx, yy], w[xx, yy] ] = 1
感谢您的回复,但问题是我需要为大型阵列高效地执行此操作。换句话说,我想避免for循环。我需要处理x的任何维度的代码,即任意数量的维度或每个维度中任意数量的元素。我对numpy不是很熟悉,所以我不知道它是否有相关的内置函数来完成这项工作。当然有argwhere、nonzero、where和extract可以做相反的事情,例如可以找到数组中非零的位置这肯定比我使用的for循环快,而且它似乎可以很好地与维度数量和每个维度中的元素数量进行缩放。谢谢,谢谢你的回复。你知道如何将它推广到任意维数的a吗?@user1857751:是的,当然,它的推广方式很简单。meshgrid在所有不希望查找的维度中创建索引向量,然后使用这些向量为原始数组和希望查找的索引编制索引。
shape_last = x.shape[-1]
x.reshape((-1, shape_last))[np.arange(y.size), y.flatten()] = 1
array([[[ 0., 0., 0., 1.],
[ 0., 0., 1., 0.],
[ 0., 1., 0., 0.]],
[[ 0., 1., 0., 0.],
[ 0., 0., 0., 1.],
[ 0., 1., 0., 0.]]])
import numpy as np
import scipy as sp
import scipy.stats.distributions
a = np.zeros((2,3,4))
z = sp.stats.distributions.randint.rvs(0, 4, size=(2,3))
xx, yy = np.meshgrid( np.arange(2), np.arange(3) )
a[ xx, yy, z[xx, yy] ] = 1
print a
a = np.zeros((2,3,4,5))
z = sp.stats.distributions.randint.rvs(0, 4, size=(2,3))
w = sp.stats.distributions.randint.rvs(0, 5, size=(2,3))
xx, yy = np.meshgrid( np.arange(2), np.arange(3) )
a[ xx, yy, z[xx, yy], w[xx, yy] ] = 1