目录
前言
一、布尔索引
二、神奇索引
三、数组转置和换轴
1. 转置
2. 换轴
总结
前言
上一节讲解了数组的索引与切片,见链接:
【自学】利用python进行数据分析 LESSON1 <Numpy基础——Numpy ndarray:多维数组对象1>_Rachel MuZy的博客-CSDN博客Numpy的核心特征之一就是N-维数组对象。目前来看这本书比较简单,这个系列希望可以在文章中多一些例子和练习,以便更容易理解、印象更加深刻。本节继续
一、布尔索引
观察以下示例:
import numpy as np
name = np.array(['MZY', 'YZY', 'MZY', 'FSQ', 'LSY', 'WRL'])
data = np.random.randn(6, 6)
print(data)
bob_data = data[name == 'MZY', 3:-1]
print(f'MZY data is {bob_data}')
结果:
[[-0.6661873 -0.82319435 -0.2407991 -0.3169944 1.32352044 1.53150433]
[ 0.54012904 -1.70815378 -1.27863924 0.54959635 -0.08906455 0.18785209]
[ 0.76567295 -1.88496805 -0.61295956 -0.01109166 -0.05879847 0.84944031]
[-1.54809788 0.3519831 0.28675188 -0.92082998 -0.30752675 1.03603913]
[-0.33572182 0.80098032 0.99937747 -0.49632963 0.12223245 -0.96911644]
[-0.15478148 0.31552357 0.6131303 0.35152443 -1.22755863 -0.54815545]]
MZY data is [[-0.3169944 1.32352044]
[-0.01109166 -0.05879847]]
注意:
(1)布尔值数组的长度必须和数组轴索引长度一致
(2)当布尔值数组的长度不正确时,布尔值选择数据的方法不会报错。因此在使用该特性时一定要小心。
(3)当要使用多个名字时,需要用布尔运算符,&(and),|(or)
代码:
import numpy as np
name = np.array(['MZY', 'YZY', 'MZY', 'FSQ', 'LSY', 'WRL'])
data = np.random.randn(6, 6)
print(data)
mask = (name == 'MZY') | (name == 'YZY')
bob_data = data[mask, 3:-1]
print(f'MZY or YZY data is {bob_data}')
结果:
[[-1.87295225 -0.72662381 -0.05102119 -0.07934683 0.50445432 -0.50295884]
[-0.12698003 -0.16843856 1.05743478 -1.48463619 0.64439123 0.48920417]
[ 0.12126085 -0.40140622 0.21214877 0.74818588 0.56292391 0.08759018]
[ 0.29959338 -1.63003972 -1.23082538 0.01015462 0.72601774 2.03787983]
[-0.03893992 -1.68172132 -0.84497915 -1.43183005 1.33786702 0.91295792]
[-0.61635564 -1.10144176 -2.50508638 1.02833843 1.22271258 0.87028547]]
MZY or YZY data is [[-0.07934683 0.50445432]
[-1.48463619 0.64439123]
[ 0.74818588 0.56292391]]
注意:python中的关键字and 和 or 对布尔值数组并没有用,请使用& |来替代
二、神奇索引
神奇索引用于描述使用整数数组进行数据索引
示例:
import numpy as np
arr = np.empty((8, 4))
for i in range(8):
arr[i] = i + 1
print(arr)
print()
print(arr[1])
print(arr[[1, 2, 3]])
先构建一个数据集arr。为了选出一个负荷特定顺序的子集,可以简单地通过传递一个包含知名所需顺序的数组来完成。
结果:
[[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.]
[8. 8. 8. 8.]]
[2. 2. 2. 2.]
[[2. 2. 2. 2.]
[3. 3. 3. 3.]
[4. 4. 4. 4.]]
如果使用负的索引,将从尾部进行选择:
代码:
import numpy as np
arr = np.empty((8, 4))
for i in range(8):
arr[i] = i + 1
print(arr)
print()
print(arr[1])
print(arr[[-1, -2, -3]])
结果:
[[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.]
[8. 8. 8. 8.]]
[2. 2. 2. 2.]
[[8. 8. 8. 8.]
[7. 7. 7. 7.]
[6. 6. 6. 6.]]
注意:一定要传递一个数组才能完成该功能,即
这里要用两个方括号
传递多个索引数组时情况不同:
会根据每个索引元组对应的元素选出一个一维数组。
示例:
import numpy as np
arr = np.arange(32).reshape((8, 4))
print(arr)
print()
a = arr[[1, 5, 7, 2], [0, 3, 1, 2]]
print(a)
结果:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]
[16 17 18 19]
[20 21 22 23]
[24 25 26 27]
[28 29 30 31]]
[ 4 23 29 10]
可以看出,arr 中(1, 0),(5, 3),(7,1),(2, 2)元素被选出来组成一维数组。
三、数组转置和换轴
1. 转置
在数组名称后面加 .T就可将数组转置
示例:
import numpy as np
arr = np.arange(32).reshape((8,4))
print(arr)
print()
print(arr.T)
结果:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]
[16 17 18 19]
[20 21 22 23]
[24 25 26 27]
[28 29 30 31]]
[[ 0 4 8 12 16 20 24 28]
[ 1 5 9 13 17 21 25 29]
[ 2 6 10 14 18 22 26 30]
[ 3 7 11 15 19 23 27 31]]
具体实例;
import numpy as np
arr = np.arange(32).reshape((8, 4))
brr = np.random.randn(8, 2)
result = np.dot(arr.T, brr)
print(result)
结果:
[[63.76239385 31.54247127]
[64.71944621 35.53896698]
[65.67649858 39.53546269]
[66.63355094 43.5319584 ]]
2. 换轴
对于更高维度的数组,transpose 方法可以接收包含轴编号的元组,用于置换轴。
示例:
import numpy as np
arr = np.arange(24).reshape((2, 4, 3))
print(arr)
print()
print(arr.T)
#转换之前是一个2 * 4 * 3 的数组,转换之后变成3 * 4 * 2 的数组
结果:
[[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
[[12 13 14]
[15 16 17]
[18 19 20]
[21 22 23]]]
[[[ 0 12]
[ 3 15]
[ 6 18]
[ 9 21]]
[[ 1 13]
[ 4 16]
[ 7 19]
[10 22]]
[[ 2 14]
[ 5 17]
[ 8 20]
[11 23]]]
总结
本节主要介绍了布尔索引和神奇索引两部分,内容不难。