目录

前言

一、布尔索引

二、神奇索引

三、数组转置和换轴

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.]]

注意:一定要传递一个数组才能完成该功能,即

python list的布尔索引 numpy布尔索引二维_数组

 这里要用两个方括号

传递多个索引数组时情况不同:

会根据每个索引元组对应的元素选出一个一维数组。

示例:

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]]]

总结

本节主要介绍了布尔索引和神奇索引两部分,内容不难。