Python:在机器学习时总结关于索引的一个小细节

1.通过argsort函数发现的一个细节:

import numpy as *
data = array([[2,4,3,4],
              [2,0,1,2],
              [2,2,2,2]])
datasort = data[:,1].argsort(0)
data1 = data[data[:,1].argsort()]
data2 = data[data[:,1].argsort(0)]
print(datasort)#argsort函数排序后的对应的索引
输出结果:
[1 2 0]

print(data[array([1,2,0])])#索引可以是数组,通过下面的nonzero函数也可以看到
输出结果:
[[2 0 1 2]
 [2 2 2 2]
 [2 4 3 4]]
 
print([1,2,0])#索引是列表,返回错误
print(data2)#data1的结果也是如此
输出结果:
[[2 0 1 2]
 [2 2 2 2]
 [2 4 3 4]]

2.通过nonzero()函数发现的:

x = np.array([[2,3,4,0],#x是数组形式
              [2,0,1,2],
              [1,1,7,2]])

y = np.mat(x)#y是x的矩阵形式
print(np.nonzero(x[:,1]<=2))
输出结果:#由于数组切片的有时会降维,axis=0方向只有一个元素
(array([1, 2], dtype=int32),)

print(np.nonzero(y[:,1]<=2))
输出结果:#矩阵切片永远是二维,axis=0方向有2个元素
(array([1, 2], dtype=int32), array([0, 0], dtype=int32))
继续看
print(np.nonzero(x[:,1]<=2)[0])
输出结果:#如果索引为1,则会:IndexError: tuple index out of range
[1 2]
print(np.nonzero(y[:,1]<=2)[1])
输出结果:
[0 0]
print(np.shape(x)):(34)
l= x[:,1]
o= np.shape(l)
print(o)
输出结果:(3,)
print(x[:,1])#降维
print(y[:,1])#不降维
print(x[:,1]<=0.5)#降维
输出结果:
[False  True False]
print(y[:,1]<=0.5)#不降维
输出结果:
[[False]
 [ True]
 [False]]
因此:!!!!!! 在用nonzero()函数切片时,注意是数组切片,还是矩阵切片,如果数组切片,索引可能发生了降维,而矩阵不会,索引根据维度选择数字索引 如:
print(x[np.nonzero(x[:,1]<=2)[0],:])#
输出结果:#对于数组,这里[0]要不要都一样,因为这里返回的切片数组只有一维array([1,2])
[[2 0 1 2]
 [1 1 7 2]]
print(x[np.nonzero(x[:,1]<=2)])
输出结果:
[[2 0 1 2]
 [1 1 7 2]]
而对于矩阵:
print(y[np.nonzero(y[:,1]<=2)[0],:])#矩阵不会,为了弥补维度的降低,axis=0的第二个元素设为0
输出结果:
[[2 0 1 2]
 [1 1 7 2]]
print(y[np.nonzero(y[:,1]<=2)])#此时内部的切片为数组array([1,2],[0,0])
(所以先时第一个数组[1,2]对应第一维:[[2 0 1 2]
 [1 1 7 2]];再是[0,0]对应第二维:[[2 1]],注意哦这里仍然没有降维,因为y是矩阵!!!!)
 输出结果:
 [[2 1]]

数组切片还得好好学>-<

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值