4
#Code

import numpy as np    
np.random.seed(124)
x_2d = np.random.randint(1,50,(3,4,5))
print("I am getting wrong output => {}".format(x_2d[0][:][1]))
print("This is what I want => {} ".format(x_2d[0,:,1]))

# Code Ended

# Output for above code

I am getting wrong output => [42  1 21 29 15]
This is what I want => [29  1 22 49] 

我是 NumPy 的新手,所以我只是在尝试 numpy 数组选择技术。我知道我们可以使用方括号法或逗号法。但是我遇到了一个问题。我正在尝试提取数组 0 的列索引 1。但是当我使用这两种技术时,我得到了不同的输出。我附上了代码片段和输出。谁能指导我哪里出错了?

4

2 回答 2

2

x[0][:][1]等价于x[0, 1, :],也等价于x[0][1]

孤独的原因[:]基本上意味着“复制这个数组”,无论是在基本的 Python 还是 Numpy 中。所以你可以读x[0][:][1]作“取数组 x 的第一个元素,复制它,然后取结果的第二个元素。”

[:]并不意味着“跳过一个维度”。

于 2021-04-15T16:10:36.013 回答
1

当你打电话时x_2d[0][:][1],首先你会得到第一个矩阵x_2d[0]

>>> first = x_2d[0]
>>> first
array([[15, 29, 18,  8,  3],
       [42,  1, 21, 29, 15],
       [22, 22, 28, 10, 31],
       [47, 49, 41, 10, 10]])

当您致电时,first[:]您将准确收到first,因为您要求输入以下所有行first

>>> second = first[:]
>>> second
array([[15, 29, 18,  8,  3],
       [42,  1, 21, 29, 15],
       [22, 22, 28, 10, 31],
       [47, 49, 41, 10, 10]])

所以当你得到second[1]你得到索引1的行

>>> third = second[1]
>>> third
array([42,  1, 21, 29, 15])

但是,当您要求时x_2d[0,:,1],numpy 将其解释为:

“从矩阵 0 给我第 1 列,从由行 0、1、2、3 组成的矩阵中)”

因此,如果您要求x_2d[1,0:2,3]结果将是[18, 2].

结论:numpyx[0,:,1]的解释方式与x[0][:][1]. 您可以在此处阅读更多 NumPy 文档。

于 2021-04-15T17:57:29.737 回答