【问题标题】:numpy index slice with None无的 numpy 索引切片
【发布时间】:2016-11-13 23:15:30
【问题描述】:

处理 numpy 的 sliding-window 示例。试图理解start_idx = np.arange(B[0])[:,None],None

foo = np.arange(10)
print foo
print foo[:]
print foo[:,]
print foo[:,None]

None 的效果似乎是对数组进行转置。

[0 1 2 3 4 5 6 7 8 9]
[0 1 2 3 4 5 6 7 8 9]
[0 1 2 3 4 5 6 7 8 9]
[[0]
 [1]
 [2]
 [3]
 [4]
 [5]
 [6]
 [7]
 [8]
 [9]]

但我不完全确定。我找不到解释第二个参数 (None) 作用的文档。这也是谷歌搜索的一个难点。 numpy array docs makes me think it has something to do with advanced indexing,但我不确定。

【问题讨论】:

  • 这里用作np.newaxis 的别名,用于添加单例维度(长度为1 的维度)。在示例案例中,添加它以将输入一维数组转换为2D,第二个暗淡为单例。

标签: python numpy


【解决方案1】:

foo[:, None] 将一维数组 foo 扩展到第二维。事实上,numpy 使用别名 np.newaxis 来做到这一点。

考虑foo

foo = np.array([1, 2])
print(foo)

[1 2]

一维数组有局限性。比如转置是什么?

print(foo.T)

[1 2]

和数组本身一样

print(foo.T == foo)

[ True True]

这个限制有很多含义,在更高维度的上下文中考虑foo 变得很有用。 numpy 使用np.newaxis

print(foo[np.newaxis, :])

[[1 2]]

但是这个np.newaxis 只是None 的语法糖

np.newaxis is None

True

所以,我们经常使用 None 代替,因为它的字符更少,意思相同

print(foo[None, :])

[[1 2]]

好的,让我们看看我们还能做些什么。请注意,我在第一个位置使用None 的示例,而 OP 使用第二个位置。此位置指定扩展哪个维度。我们本可以更进一步。让这些例子帮助解释

print(foo[None, :])  # same as foo.reshape(1, 2)

[[1 2]]

print(foo[:, None])  # same as foo.reshape(2, 1)

[[1]
 [2]]

print(foo[None, None, :])  # same as foo.reshape(1, 1, 2) 

[[[1 2]]]

print(foo[None, :, None])  # same as foo.reshape(1, 2, 1)

[[[1]
  [2]]]

print(foo[:, None, None])  # same as foo.reshape(2, 1, 1)

[[[1]]

 [[2]]]

记住 numpy 打印数组时哪个维度是哪个维度

print(np.arange(27).reshape(3, 3, 3))

          dim2        
          ────────⇀
dim0 →  [[[ 0  1  2]   │ dim1
          [ 3  4  5]   │
          [ 6  7  8]]  ↓
          ────────⇀
     →   [[ 9 10 11]   │
          [12 13 14]   │
          [15 16 17]]  ↓
          ────────⇀
     →   [[18 19 20]   │
          [21 22 23]   │
          [24 25 26]]] ↓

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-17
    • 1970-01-01
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-24
    相关资源
    最近更新 更多