切片正在向我的数组中添加第三维不知道为什么

2024-03-28 17:28:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用2和3的标签来索引testdata。但是,当我运行此代码时,它会将数组从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,:]

Tags: 代码numpylabels标签数组numtestdatatranspose
1条回答
网友
1楼 · 发布于 2024-03-28 17:28:23

当有谜题时,打印中间值。更好的是,在一个交互式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是一个具有一个1d数组的元组。你知道吗

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)

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


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

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

相关问题 更多 >