随笔记录——numpy1

这篇博客介绍了如何使用numpy对数组进行基于布尔值的过滤和索引操作。通过示例展示了如何选取特定名称对应的行、按条件选取列、对数据取反以及联合多个条件进行过滤。还讨论了在赋值时的注意事项,以及如何通过索引获取特定顺序的子集。内容涵盖了数据选择、切片和多条件操作,对于理解numpy数据处理非常有帮助。
摘要由CSDN通过智能技术生成
10、假设每个人名都和data数组中的一行相对应,并且我们想要选中所有’nana’对应的行。
names = np.array(['nana', 'zhengzheng', 'fangfang', 'zhengzheng', 'nana', 'dingding', 'huanhuan'])
data = np.random.rand(7, 5)
data
Out[83]: 
array([[0.36880059, 0.8395524 , 0.1620856 , 0.43745294, 0.60072609],
       [0.90758299, 0.85110065, 0.33240056, 0.12152409, 0.2311381 ],
       [0.68127254, 0.29100165, 0.24362704, 0.22374143, 0.78298262],
       [0.81500746, 0.33877205, 0.4698735 , 0.85866448, 0.2551259 ],
       [0.81626763, 0.75416682, 0.70522153, 0.00727943, 0.67708974],
       [0.67674142, 0.32260481, 0.98239335, 0.69060303, 0.24409228],
       [0.53585089, 0.20241624, 0.40155367, 0.00163832, 0.55407748]])

数组的比较操作(比如==)也是可以向量化的。因此,比较names数组和字符串’nana’会产生一个布尔值数组:

names == 'nana'
Out[84]: array([ True, False, False, False,  True, False, False])

在索引数组时可以传入布尔值数组:

data[names == 'nana']
Out[85]: 
array([[0.36880059, 0.8395524 , 0.1620856 , 0.43745294, 0.60072609],
       [0.81626763, 0.75416682, 0.70522153, 0.00727943, 0.67708974]])

注:当布尔值数组的长度不正确时,布尔值选择数据的方法并不会报错,因此我建议在使用该特性的时候要小心。

10.1、在选择行的同时索引列
data[names == 'nana', 3:]
Out[87]: 
array([[0.43745294, 0.60072609],
       [0.00727943, 0.67708974]])
10.2、条件取反

为了选择除了’nana’以外的其他数据,你可以使用!=或在条件表达式前使用~对条件取反:

names != 'nana'
Out[89]: array([False,  True,  True,  True, False,  True,  True])
data[~(names=='nana')]
Out[91]: 
array([[0.90758299, 0.85110065, 0.33240056, 0.12152409, 0.2311381 ],
       [0.68127254, 0.29100165, 0.24362704, 0.22374143, 0.78298262],
       [0.81500746, 0.33877205, 0.4698735 , 0.85866448, 0.2551259 ],
       [0.67674142, 0.32260481, 0.98239335, 0.69060303, 0.24409228],
       [0.53585089, 0.20241624, 0.40155367, 0.00163832, 0.55407748]])
10.3、多个条件过滤

当要选择三个名字中的两个时,可以对多个布尔值条件进行联合,需要使用数学操作符如&(and)和|(or):

mask = (names =='nana')|(names=='dingding')
mask
Out[93]: array([ True, False, False, False,  True,  True, False])
data[mask]
Out[94]: 
array([[0.36880059, 0.8395524 , 0.1620856 , 0.43745294, 0.60072609],
       [0.81626763, 0.75416682, 0.70522153, 0.00727943, 0.67708974],
       [0.67674142, 0.32260481, 0.98239335, 0.69060303, 0.24409228]])
10.4、对布尔值选择的数据赋值

使用布尔值索引选择数据时,总是生成数据的拷贝,所以如果想更新值,需要直接赋值:

un_data = data[~(names=='nana')]
un_data = 0
# 原来的数组值不会有任何变化
data
Out[101]: 
array([[0.36880059, 0.8395524 , 0.1620856 , 0.43745294, 0.60072609],
       [0.90758299, 0.85110065, 0.33240056, 0.12152409, 0.2311381 ],
       [0.68127254, 0.29100165, 0.24362704, 0.22374143, 0.78298262],
       [0.81500746, 0.33877205, 0.4698735 , 0.85866448, 0.2551259 ],
       [0.81626763, 0.75416682, 0.70522153, 0.00727943, 0.67708974],
       [0.67674142, 0.32260481, 0.98239335, 0.69060303, 0.24409228],
       [0.53585089, 0.20241624, 0.40155367, 0.00163832, 0.55407748]])
# 直接赋值才有效果
data[data < 0.1] = 0
data
Out[103]: 
array([[0.36880059, 0.8395524 , 0.1620856 , 0.43745294, 0.60072609],
       [0.90758299, 0.85110065, 0.33240056, 0.12152409, 0.2311381 ],
       [0.68127254, 0.29100165, 0.24362704, 0.22374143, 0.78298262],
       [0.81500746, 0.33877205, 0.4698735 , 0.85866448, 0.2551259 ],
       [0.81626763, 0.75416682, 0.70522153, 0.        , 0.67708974],
       [0.67674142, 0.32260481, 0.98239335, 0.69060303, 0.24409228],
       [0.53585089, 0.20241624, 0.40155367, 0.        , 0.55407748]])
11、通过索引获取特定顺序的子集
arr = np.empty((8, 4))
for i in range(8):
    arr[i] = i
arr
Out[106]: 
array([[0., 0., 0., 0.],
       [1., 1., 1., 1.],
       [2., 2., 2., 2.],
       [3., 3., 3., 3.],
       [4., 4., 4., 4.],
       [5., 5., 5., 5.],
       [6., 6., 6., 6.],
       [7., 7., 7., 7.]])
arr[[2, 3, 1, 6]]
Out[107]: 
array([[2., 2., 2., 2.],
       [3., 3., 3., 3.],
       [1., 1., 1., 1.],
       [6., 6., 6., 6.]])
       
arr[[-4, -3, -1]]
Out[108]: 
array([[4., 4., 4., 4.],
       [5., 5., 5., 5.],
       [7., 7., 7., 7.]])
11.1、传递多个索引数组选定特定值

下面是选定(0, 2),(2, 0), (3, 4)位置的值并组成一维数组。

arr = np.arange(20).reshape((4, 5))

arr[[0, 2, 3 ], [2, 0 , 4]]
Out[110]: array([ 2, 10, 19])

arr
Out[111]: 
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [10, 11, 12, 13, 14],
       [15, 16, 17, 18, 19]])

下面是选择定(0,2,3)行的(2, 0,4)列数据

arr[[0, 2, 3 ]][:,[2, 0 , 4]]
Out[112]: 
array([[ 2,  0,  4],
       [12, 10, 14],
       [17, 15, 19]])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值