使用Numpy替换任意轴

时间:2017-09-28 21:55:14

标签: python arrays numpy

如果我事先不知道轴,怎样才能替换数组值?

例如,如果我想做类似

的事情
arr[:,5]

但我事先并不知道轴,并希望将其设为一般我可以使用take

arr.take(5, axis=1)

并且它将起作用。

但是,如果我想要像

那样的话
arr[:,5]=10

但我事先不知道轴,我该怎么办呢?我显然无法做arr.take(5, axis=1) = 10,而我无法找到执行该功能的功能。

最接近的功能(我发现)将是np.put(),但我不认为可以用它完成。

2 个答案:

答案 0 :(得分:3)

您可以将所需的轴交换到第一个位置,然后进行分配。 swapaxes返回一个视图,因此作业将按照您的意愿进行。

例如,

In [87]: np.random.seed(123)

In [88]: a = np.random.randint(1, 9, size=(5, 8))

In [89]: a
Out[89]: 
array([[7, 6, 7, 3, 5, 3, 7, 2],
       [4, 3, 4, 2, 7, 2, 1, 2],
       [7, 8, 2, 1, 7, 1, 8, 2],
       [4, 7, 6, 5, 1, 1, 5, 2],
       [8, 4, 3, 5, 8, 3, 5, 8]])

In [90]: ax = 1

In [91]: k = 5

In [92]: val = 99

In [93]: a.swapaxes(0, ax)[k] = val

In [94]: a
Out[94]: 
array([[ 7,  6,  7,  3,  5, 99,  7,  2],
       [ 4,  3,  4,  2,  7, 99,  1,  2],
       [ 7,  8,  2,  1,  7, 99,  8,  2],
       [ 4,  7,  6,  5,  1, 99,  5,  2],
       [ 8,  4,  3,  5,  8, 99,  5,  8]])

In [95]: ax = 0

In [96]: k = 2

In [97]: val = -1

In [98]: a.swapaxes(0, ax)[k] = val

In [99]: a
Out[99]: 
array([[ 7,  6,  7,  3,  5, 99,  7,  2],
       [ 4,  3,  4,  2,  7, 99,  1,  2],
       [-1, -1, -1, -1, -1, -1, -1, -1],
       [ 4,  7,  6,  5,  1, 99,  5,  2],
       [ 8,  4,  3,  5,  8, 99,  5,  8]])

答案 1 :(得分:2)

我认为没有NumPy功能,但构建自己的功能并不难:

def replace(arr, indices, val, axis):
    s = [slice(None)]*arr.ndim
    s[axis] = indices
    arr[s] = val
import numpy as np

def replace(arr, indices, val, axis):
    s = [slice(None)]*arr.ndim
    s[axis] = indices
    arr[s] = val

arr = np.zeros((3,6,2))
indices = 5
axis = 1
val = 10

replace(arr, indices, val, axis)
print(np.take(arr, indices, axis))

打印

[[ 10.  10.]
 [ 10.  10.]
 [ 10.  10.]]