python - 切片正在向我的阵列添加第三维 - 不知道为什么

标签 python numpy

我正在尝试仅使用等于 2 和 3 的标签来索引测试数据。但是,当我运行这段代码时,它会将我的数组从 2D (100 x 100) 转换为 3D (100 x 1 x 100)。

谁能解释一下为什么要这样做?代码中的最后一行是罪魁祸首,但我不确定为什么会这样。

labels = testdata[:,0]
num2 = numpy.nonzero(labels == 2)
num2 = numpy.transpose(num2)
num3 = numpy.nonzero(labels == 3)
num3 = numpy.transpose(num3)
num = numpy.vstack([num2,num3])
testdata = testdata[num,:]

最佳答案

有拼图时,打印中间值。更好的是,在交互式 shell 中运行测试用例,这样您就可以检查每个值,并了解发生了什么。跟踪形状。

看起来 labels 是一维数字数组,例如:

In [212]: labels=np.array([0,1,2,2,3,2,0,3,2])

labels 为 2 或 3 的索引:

In [213]: num2=np.nonzero(labels==2)
In [214]: num2
Out[214]: (array([2, 3, 5, 8], dtype=int32),)
In [215]: num3=np.nonzero(labels==3)

这里有一个关键的步骤——transpose 的目的是什么。请注意 num2 是一个包含一个一维数组的元组。

In [216]: num2=np.transpose(num2)
In [217]: num3=np.transpose(num3)
In [218]: num2
Out[218]: 
array([[2],
       [3],
       [5],
       [8]], dtype=int32)

num2转置后是一个列数组,(4,1)形状。

垂直连接它们会产生一个 (6,1) 数组:

In [220]: num=np.vstack([num2,num3])
In [221]: num
Out[221]: 
array([[2],
       [3],
       [5],
       [8],
       [4],
       [7]], dtype=int32)
In [222]: num.shape
Out[222]: (6, 1)
In [223]: labels[num]
Out[223]: 
array([[2],
       [2],
       [2],
       [2],
       [3],
       [3]])
In [224]: labels[num].shape
Out[224]: (6, 1)

用该数组索引一维数组会生成另一个与索引形状相同的数组。索引 x[num,:] 做同样的事情,但添加了最后一个维度。


如果我在第一维中用 (2,5) 数组索引 (3,4) 数组,结果是 (2,5,4) 数组:

In [227]: np.ones((3,4))[np.ones((2,5),int),:].shape
Out[227]: (2, 5, 4)

关于python - 切片正在向我的阵列添加第三维 - 不知道为什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39194834/

相关文章:

python - Python 中的 Numpy 类型提示 (PEP 484)

python - 如何沿轴合并和拆分numpy数组?

python - 列表到嵌套字典

python - Pandas 重采样的问题

python - 使用 numpy 导入数组文件

python - 沿 y=x 有效地翻转/转置图像

Python//解析Json到MySQL

python - 如何使用 Python 从二进制文件中解压缩字节数组?

Python3找到最后一次出现的字符串然后写入

python - Numpy 矩阵行比较