Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 按索引复制numpy数组的单个轴_Python_Numpy - Fatal编程技术网

Python 按索引复制numpy数组的单个轴

Python 按索引复制numpy数组的单个轴,python,numpy,Python,Numpy,我在寻找一种优雅的方法,通过索引提取numpy数组的单个轴的值。例如: x = np.arange(16).reshape((4,4)) a = x[0] b = x[:, 0] 这是我通常做的事,但我正在寻找类似的东西: a = get( x, axis=0, index=0) b = get( x, axis=1, index=0) 也许有什么奇特的功能可以做到这一点 您可以使用将感兴趣的轴移动到前面,然后像正常情况一样索引到其中: def get(x, axis=0, index=0

我在寻找一种优雅的方法,通过索引提取numpy数组的单个轴的值。例如:

x = np.arange(16).reshape((4,4))
a = x[0]
b = x[:, 0] 
这是我通常做的事,但我正在寻找类似的东西:

a = get( x, axis=0, index=0)
b = get( x, axis=1, index=0)
也许有什么奇特的功能可以做到这一点

您可以使用将感兴趣的轴移动到前面,然后像正常情况一样索引到其中:

def get(x, axis=0, index=0):
    return np.rollaxis(x, axis, 0)[index]

x = np.arange(27).reshape(3, 3, 3)

assert np.all(get(x, 1, 2) == x[:, 2, :])
正如Joe正确指出的,这将返回
x
上的视图。要强制复制,可以使用
.copy()
方法:

cpy = get(x, 1, 2).copy()

您可以直接使用
\uuuu getitem\uuuu
魔术方法来获得相同的功能,但更容易支持动态参数。下面是一个使用
itertools
包的示例:

def get(matrix, axis, index):
    return a.__getitem__(tuple(chain(repeat(slice(None), axis), (index,))))
这将创建一个元组,其中包含一个slice对象,该对象表示
a[:]
中的冒号,重复
次,最后是
索引
。我认为元组生成是可以清理的,但目前我想不出更干净的方法

示例用法如下:

a = np.arange(9).reshape(3, 3) # [[0 1 2], [3 4 5], [6 7 8]]
get(a, axis=0, index=0) # [0 1 2]
get(a, axis=1, index=0) # [0 3 6]
get(a, axis=0, index=1) # [3 4 5]
get(a, axis=1, index=1) # [1 4 7]

你只需要这个2d阵列吗?如果是这样的话,你可以很容易地使用转置。为了OP的缘故,应该用für N dimensions来详细说明一下:以这种方式使用
rollaxis
在numpy中是一个常见的习惯用法
np.rollaxis
生成视图而不是副本,因此这种技术与直接编写索引表达式一样高效、快速。它在很多情况下都很有用,您需要在N维数组的任意轴上进行操作。滚动,然后在第一个轴上操作。因为滚动创建了一个视图,如果对“滚动”版本进行了修改,也会在原始版本中进行修改。