Numpy,Scipy
用户说明 https://docs.scipy.org/doc/
参考:
https://www.cnblogs.com/sirkevin/p/5763003.html
一、布尔索引
# -*- coding: utf-8 -*- import numpy as np import numpy.random as np_random print('使用布尔数组作为索引') name_arr = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe']) rnd_arr = np_random.randn(7, 4) # 随机7*4数组 print(rnd_arr) print(name_arr == 'Bob') # 返回布尔数组,元素等于'Bob'为True,否则False。 print(rnd_arr[name_arr == 'Bob']) # 利用布尔数组选择行 print(rnd_arr[name_arr == 'Bob', :2]) # 增加限制打印列的范围 print(rnd_arr[~(name_arr == 'Bob')]) # 对布尔数组的内容取反 mask_arr = (name_arr == 'Bob') | (name_arr == 'Will') # 逻辑运算混合结果 print(rnd_arr[mask_arr]) rnd_arr[name_arr != 'Joe'] = 7 # 先布尔数组选择行,然后把每行的元素设置为7。 print(rnd_arr)
[[ 0.3834434 -1.22453242 -1.46557058 1.06867539]
[-0.28098557 0.86959849 0.7402669 -0.28206714]
[ 0.41440581 0.67994302 1.69035537 -0.10880771]
[-1.4988465 1.06883183 -0.41474932 -1.01324613]
[ 1.56141654 1.15810509 0.37055455 -0.53629394]
[-0.43595978 0.47283238 0.81916805 -1.35681934]
[-0.85875885 -0.70351669 1.27991661 -1.22253574]]
[ True False False True False False False]
[[ 0.3834434 -1.22453242 -1.46557058 1.06867539]
[-1.4988465 1.06883183 -0.41474932 -1.01324613]]
[[ 0.3834434 -1.22453242]
[-1.4988465 1.06883183]]
[[-0.28098557 0.86959849 0.7402669 -0.28206714]
[ 0.41440581 0.67994302 1.69035537 -0.10880771]
[ 1.56141654 1.15810509 0.37055455 -0.53629394]
[-0.43595978 0.47283238 0.81916805 -1.35681934]
[-0.85875885 -0.70351669 1.27991661 -1.22253574]]
[[ 0.3834434 -1.22453242 -1.46557058 1.06867539]
[ 0.41440581 0.67994302 1.69035537 -0.10880771]
[-1.4988465 1.06883183 -0.41474932 -1.01324613]
[ 1.56141654 1.15810509 0.37055455 -0.53629394]]
[[ 7. 7. 7. 7. ]
[-0.28098557 0.86959849 0.7402669 -0.28206714]
[ 7. 7. 7. 7. ]
[ 7. 7. 7. 7. ]
[ 7. 7. 7. 7. ]
[-0.43595978 0.47283238 0.81916805 -1.35681934]
[-0.85875885 -0.70351669 1.27991661 -1.22253574]]
二、花式索引
# -*- coding: utf-8 -*- import numpy as np print('Fancy Indexing: 使用整数数组作为索引') arr = np.empty((8, 4)) for i in range(8): arr[i] = i print(arr) arr.dtype print(arr[[4, 3, 0, 6]]) # 打印arr[4]、arr[3]、arr[0]和arr[6] print(arr[[-3, -5, -7]]) # 打印arr[3]、arr[5]和arr[-7]行 arr = np.arange(32).reshape((8, 4)) # 通过reshape变换成二维数组 print(arr) print(arr[[1, 5, 7, 2], [0, 3, 1, 2]]) # 打印arr[1, 0]、arr[5, 3],arr[7, 1]和arr[2, 2] print(arr[[1, 5, 7, 2]][:, [0, 3, 1, 2]]) # 1572行的0312列 print(arr[np.ix_([1, 5, 7, 2], [0, 3, 1, 2])]) # 可读性更好的写法
Fancy Indexing: 使用整数数组作为索引
[[ 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.]]
[[ 4. 4. 4. 4.]
[ 3. 3. 3. 3.]
[ 0. 0. 0. 0.]
[ 6. 6. 6. 6.]]
[[ 5. 5. 5. 5.]
[ 3. 3. 3. 3.]
[ 1. 1. 1. 1.]]
[[ 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]
[[ 4 7 5 6]
[20 23 21 22]
[28 31 29 30]
[ 8 11 9 10]]
[[ 4 7 5 6]
[20 23 21 22]
[28 31 29 30]
[ 8 11 9 10]]
三、数组转秩和轴对换
# -*- coding: utf-8 -*- import numpy as np import numpy.random as np_random print('转置矩阵') arr = np.arange(15).reshape((3, 5)) print(arr) print(arr.T) print() print('随机六行三列矩阵') arr = np_random.randn(6, 3) print(arr) print('转置矩阵做点积,就是矩阵乘法') print(np.dot(arr.T, arr)) print() print('高维矩阵转换--三维') arr = np.arange(16).reshape((2, 2, 4)) print(arr) ''' 详细解释: arr数组的内容为 - a[0] = [[0, 1, 2, 3] [4, 5, 6, 7]] - a[1] = [[8, 9, 10, 11][12, 13, 14, 15]] - a[0][0] = [0, 1, 2, 3] - a[0][1] = [4, 5, 6, 7] - a[1][0] = [8, 9, 10, 11] - a[1][1] = [12, 13, 14, 15] transpose的参数为坐标轴(维度),正常顺序为(0, 1, 2, ... , n - 1), 现在传入的为(1, 0, 2)代表a[x][y][z] = a[y][x][z],第0个和第1个坐标互换,即维度0和维度1元素互换。 - a'[0][0] = a[0][0] = [0, 1, 2, 3] - a'[0][1] = a[1][0] = [8, 9, 10, 11] - a'[1][0] = a[0][1] = [4, 5, 6, 7] - a'[1][1] = a[1][1] = [12, 13, 14, 15] ''' print(arr.transpose((1, 0, 2))) # transpose()维度坐标互换,矩阵的第0维和第1维数据互换,第2维数据保持不变。 print(arr.swapaxes(1, 2)) # 直接交换第1和第2个坐标轴,作用与transpose一样,只是用于直接交换两轴。
转置矩阵
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]]
[[ 0 5 10]
[ 1 6 11]
[ 2 7 12]
[ 3 8 13]
[ 4 9 14]]
随机六行三列矩阵
[[ 0.00336604 0.13483609 -0.42650712]
[-0.29956396 0.73500445 0.798028 ]
[-0.93623025 0.65210119 -0.21602772]
[-1.30958224 0.81461983 -0.33047833]
[ 0.10900651 0.25512692 0.66414076]
[ 0.01027809 1.0457967 -0.78575051]]
转置矩阵做点积,就是矩阵乘法
[[ 2.69327067 -1.85849621 0.45886382]
[-1.85849621 2.80603422 -0.53333565]
[ 0.45886382 -0.53333565 2.03312772]]
高维矩阵转换--三维
[[[ 0 1 2 3]
[ 4 5 6 7]]
[[ 8 9 10 11]
[12 13 14 15]]]
[[[ 0 1 2 3]
[ 8 9 10 11]]
[[ 4 5 6 7]
[12 13 14 15]]]
[[[ 0 4]
[ 1 5]
[ 2 6]
[ 3 7]]
[[ 8 12]
[ 9 13]
[10 14]
[11 15]]]
四、快速的元素级数组函数
以下函数都是元素级函数,对多维数组的每个元素进行操作。
1、一元函数
类型 | 说明 |
abs, fabs | 计算整数、浮点数或复数的绝对值。对于非复数值,可以使用更快的fabs。 |
sqrt | 计算各元素的平方根。相当于arr ** 0.5 |
sqare | 计算各元素的平方。相当于arr ** 2 |
exp | 计算各元素的e^x |
log, log10, log2, log1p | 分别为自然对数、底数为10的log、底数为2的log和log(1 + x)。 |
sign | 计算各元素的正负号:1(正数)、0(零)、-1(负数)。 |
ceil (天花板值,上限值) | 计算各元素的ceiling值,即大于等于该值的最小整数。 |
floor (地板值,下限值) | 计算各元素的floor值,即小于等于该值的最小整数。 |
2、二元函数I
元素级函数,要求两个数组是同型数组。
类型 | 说明 |
add | 将数组中对应的元素相加 |
subtract | 从第一个数组中减去第二个数组中的元素 |
multiply | 数组元素相乘 |
divide, floor_divide | 除法或向下取整除法 |
power | 对第一个数组中的元素A和第二个数组中对应位置的元素B,计算A^B。 |
maximum, fmax | 元素级的最大值计算。fmax将忽略NaN。 |
minimum, fmin | 元素级的最小值计算。fmin将忽略NaN。 |
mod | 元素级的求模计算 |
# -*- coding: utf-8 -*-
import numpy as np
import numpy.random as np_random
print('求平方根')
arr = np.arange(10)
print(np.sqrt(arr))
print()
print('数组比较')
x = np_random.randn(8)
y = np_random.randn(8)
print(x)
print(y)
print(np.maximum(x, y))
print()
print('使用modf函数把浮点数分解成整数和小数部分')
arr = np_random.randn(7) * 5 # 统一乘5
print(np.modf(arr))
求平方根
[ 0. 1. 1.41421356 1.73205081 2. 2.23606798
2.44948974 2.64575131 2.82842712 3. ]
数组比较
[ 0.04374363 0.73963677 -1.05047708 -0.24986391 -1.25035852 -0.54490458
1.86808298 1.40613843]
[ 1.04329169 3.10989897 0.87574044 0.67255552 -1.15074125 -0.41827462
0.34172563 -0.51396996]
[ 1.04329169 3.10989897 0.87574044 0.67255552 -1.15074125 -0.41827462
1.86808298 1.40613843]
使用modf函数把浮点数分解成整数和小数部分
(array([-0.87801128, 0.57339453, 0.37370041, -0.01194522, -0.29938194,
-0.70582213, -0.78007599]), array([-2., 5., 5., -0., -1., -2., -9.]))
3.二元数组II
类型 | 说明 |
copysign | 将第二个数组中的符号复制给第一个数组中的值 |
greater, greater_equal, less, less_equal,equal, not_equal | 执行元素级的比较,最终产生布尔型数组。 |
logical_and, logical_or, logical_xor | 执行元素级的真值逻辑运算,最终产生布尔型数组。 |