有没有一种简单的方法来创建一个numpy数组(可能有多个维度),其中某个位置为1,其他位置为0?对于一维数组,可以使用以下方法在第k个位置创建一个具有1的数组:
np.eye(1, N, k = k)
这如何推广到更高维的情况?
有没有一种简单的方法来创建一个numpy数组(可能有多个维度),其中某个位置为1,其他位置为0?对于一维数组,可以使用以下方法在第k个位置创建一个具有1的数组:
np.eye(1, N, k = k)
这如何推广到更高维的情况?
M, N = 3, 5
i, j = 2, 3
np.eye(1, M * N, k=(i+1) * M + j).reshape(M, N)
array([[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 1., 0., 0.]])
了解到每个多维numpy数组实际上都是以1D数组的形式进行内部表示的,同时还有一些包装逻辑来处理步长和索引。这意味着这里的解决方案也可以通过适当的算术运算推广到任何维度。以下是一个泛化版本:
def make_nd_array_with(dims, index):
return (np.eye(1,
np.prod(dims),
k=(((np.array(index[:-1]) + 1) * dims[:-1]).sum() + index[-1]))
.reshape(*dims))
make_nd_array_with((M,N), (i,j))
array([[0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0.],
[0., 0., 1., 0., 0.]])
arr = np.zeros(M, N)
arr[i, j] = 1
eye
或 reshape
,直接编写一个调用 zeros
并设置所需元素的函数会明确得多。def mostly_zeros(shape, nonzero_position, dtype=float, nonzero_element=1):
retval = numpy.zeros(shape, dtype=dtype)
retval[nonzero_index] = nonzero_element
return retval
你可以调用 mostly_zeros(shape=(4, 5), nonzero_position=(2, 2))
来获得一个形状为 (4, 5)
,在位置 (2, 2)
上的值为 1.0
的几乎全零数组。这将比使用 eye
更容易维护。
或者你可以编写一个设置元素并返回数组的函数:
def chainable_setitem(obj, index, val):
obj[index] = val
return obj
接下来您可以使用chainable_setitem(numpy.zeros((4, 5)), (2, 2), 1)
来得到一个4x5的数组,在位置(2, 2)处有一个值为1.0,其他位置都是0。
np.bincount([np.ravel_multi_index(pos,shp)],None,np.prod(shp)).reshape(shp)
shp = 3,4
pos = 1,2
np.bincount([np.ravel_multi_index(pos,shp)],None,np.prod(shp)).reshape(shp)
# array([[0, 0, 0, 0],
# [0, 0, 1, 0],
# [0, 0, 0, 0]])
诚然,在一维情况下,这样做会更好,因为它可以简化为
np.bincount([pos],None,length)
np.eye
会更好:np.eye(<N>)[<pos>]
。 - z1ne2wo