机器学习--准备数据与Numpy(一)

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,否则Falseprint(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  # 先布尔数组选择行,然后把每行的元素设置为7print(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行的0312print(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
执行元素级的真值逻辑运算,最终产生布尔型数组。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值