我正在尝试仅使用等于 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/