python集合为什么不能用下标运算_numpy 数组集合运算及下标操作

1. 数组的集合运算

1.1. 并集

np.union1d(a,b)计算数组的并集:

In [1]: importnumpy as np

In [2]: a = np.array([1,2,3])

In [3]: b = np.array([3,4,5])

In [4]: np.union1d(a,b)

Out[4]: array([1, 2, 3, 4, 5])

1.2. 交集

np.intersect1d(a,b)计算数组的交集:

In [10]: importnumpy as np

In [11]: a = np.array([2,3,4,5])

In [12]: b = np.array([3,5,6])

In [13]: np.intersect1d(a,b)

Out[13]: array([3, 5])

1.3. 差集

np.setdiff1d(a,b)计算结果为a集合减去b集合,也就是剩下没有在b中出现的元素:

In [15]: importnumpy as np

In [16]: a = [1,1,2,2,3,4,5]

In [17]: b = [2,5]

In [18]: np.setdiff1d(a,b)

Out[18]: array([1, 3, 4])

1.4. 异或

np.setxor1d(a,b)计算a、b集合的异或结果。

In [15]: importnumpy as np

In [16]: a = [1,1,2,2,3,4,5]

In [17]: b = [2,5]

In [26]: np.setxor1d(a,b)

Out[26]: array([1, 3, 4])

可以注意到,一般对两个数组进行集合操作,会对数组自动进行去重。

2. np.where函数

2.1. 第一种用法

where(c, a, b),是numpy风格的if-else三元运算符。它通过一个布尔数组(c)和两个其他数组(a和b)得出数组d,数组d满足:如果c[i]为真,则d[i]=a[i],否则d[i]=b[i]。三个数组必须具有相同的形状。

例1:

In [30]: x = np.random.randn(4,4)

In [31]: x

Out[31]:

array([[0.47223924, -0.74427759, -1.67279362, 0.01203576],

[-0.83590182, 1.70742332, -1.01150273, 0.50330454],

[0.76771725, -1.38832902, -0.62673363, 0.27442247],

[-1.01199694, -0.65573435, 0.89553293, -0.74830605]])

In [32]: np.where(x>0,2,-2)

Out[32]:

array([[2, -2, -2, 2],

[-2, 2, -2, 2],

[2, -2, -2, 2],

[-2, -2, 2, -2]])

例2:

In [33]: xarr = np.array([1.1,1.2,1.3,1.4,1.5])

...: yarr= np.array([2.1,2.2,2.3,2.4,2.5])

...: zarr=np.array([True,False,True,True,False])

In [34]: np.where(zarr,xarr,yarr)

Out[34]: array([1.1, 2.2, 1.3, 1.4, 2.5])

2.2. 第二种用法

where(conditions) ,相当于给出符合条件的数组元素的下标。

例子1:

In [37]: x = np.random.randn(4)

In [38]: x

Out[38]: array([-0.0860867 , 1.42173872, -1.44341208, 0.61600628])

In [39]: np.where(x>0)

Out[39]: (array([1, 3], dtype=int64),)

例子2:如果想要求a集合中的元素在b中也存在,这样的下标,需要用到np.in1d(a,b)或者np.isin(a,b):

In [40]: a = np.array([1,2,4,5,6])

In [41]: b = np.array([2,6])

In [42]: np.where(np.in1d(a, b))

Out[42]: (array([1, 4], dtype=int64),)

In [46]: np.where(np.isin(a,b))

Out[46]: (array([1, 4], dtype=int64),)

可以观察到,where(conditions)取下标,返回的是一个元组,如果需要取这个下标数组需要通过结果result[0]去取或者(result,)=np.where(conditions)

3. 参考

(完)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值