繁体   English   中英

Numpy ndarray:了解切片对象和“:”

[英]Numpy ndarray: understanding slice objects and “:”

假设您有:

data = np.array([ 
        [ 0,   1   ],
        [ 0,   1   ] 
      ], dtype='int64')

调用

data[:, 1]

产量

[1. 1.]

然而

data[(slice(None,None,None), slice(1,2,None))]

产量

[[1.]
 [1.]]

怎么会?

我将如何显式编写slice对象以获得[:, 1]的等效项?

使用切片对象索引与使用整数索引具有不同的语义。 使用单个整数进行索引会折叠/删除相应的维,而使用切片进行索引则不会这样做。

如果您希望具有沿某个轴使用单个整数进行索引的行为,则可以使用切片和一些重塑逻辑对其进行仿真; 但是最不费力的解决方案是只用相应的整数替换该切片。

或者,有np.squeeze。 绝对不要在没有axis关键字的情况下使用它,因为这是产生意外行为的代码的保证配方。 但是,仅挤压您切过的那些轴会产生您似乎想要的效果。

如果您可以允许我做一个小混混:从更高层次上讲,我怀疑您追求的是一种非常麻木的反模式。 如果我必须制定numpy的第一个规则,那不是因为轴碰巧是单例而挤压轴。 拥抱ndarray并意识到更多的轴不会使您的代码更复杂,但是它使您可以表达数据的有意义的语义。 首先要对该轴进行切片的事实表明,该轴的大小基本上不是1;相反, 在特定情况下恰好是如此。 压缩该单例维度将几乎不可能以numpythonic和无错误的方式编写任何下游代码。 如果您绝对必须压缩数组,例如在将其传递给绘图函数之前说,请像对待C ++中那样为堆栈分配的变量那样对待它,并且不要让对其的任何引用泄漏到当前范围之外,因为您会出现乱码数组的语义,下游代码不再知道“它在看什么”。

似乎您需要在使用slice对象后自行删除单例尺寸。 或者有一些我不理解的底层实现细节。

import numpy as np
data = np.array([
        [ 0,   1   ],
        [ 0,   1   ]
      ], dtype='int64')
print("desired result")
print(data[:, 1])
print("first try")
print(data[(slice(None,None,None), slice(1,2,None))])
print("solution")
print(data[[slice(None,None,None), slice(1,2,None)]].squeeze())

输出:

desired result
[1 1]
first try
[[1]
 [1]]
solution
[1 1]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM