python关于numpy基础问题
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python关于numpy基础问题相关的知识,希望对你有一定的参考价值。
a = np.arange(15).reshape(3, 5)
a.ndim
执行结果是2,非常不解,nidm是轴的个数,a有3个维度,为什么ndim结果是2,不是3呢 ?
ndarray
ndarray(以下简称数组)是numpy的数组对象,需要注意的是,它是同构的,也就是说其中的所有元素必须是相同的类型。其中每个数组都有一个shape和dtype。
shape既是数组的形状,比如
复制代码
1 import numpy as np
2 from numpy.random import randn
3
4 arr = randn(12).reshape(3, 4)
5
6 arr
7
8 [[ 0.98655235 1.20830283 -0.72135183 0.40292924]
9 [-0.05059849 -0.02714873 -0.62775486 0.83222997]
10 [-0.84826071 -0.29484606 -0.76984902 0.09025059]]
11
12 arr.shape
13 (3, 4)
复制代码
其中(3, 4)即代表arr是3行4列的数组,其中dtype为float64
一下函数可以用来创建数组
array 将输入数据转换为ndarray,类型可制定也可默认
asarray 将输入转换为ndarray
arange类似内置range
ones、ones_like 根据形状创建一个全1的数组、后者可以复制其他数组的形状
zeros、zeros_like类似上面,全0
empty、empty_like创建新数组、只分配空间
eye、identity创建对角线为1的对角矩阵
数组的转置和轴对称
转置是多维数组的基本运算之一。可以使用.T属性或者transpose()来实现。.T就是进行轴对换而transpose则可以接收参数进行更丰富的变换
复制代码
arr = np.arange(6).reshape((2,3))
print arr
[[0 1 2]
[3 4 5]]
print arr.T
[[0 3]
[1 4]
[2 5]]
arr = np.arange(24).reshape((2,3,4))
print arr
[[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
[[12 13 14 15]
[16 17 18 19]
[20 21 22 23]]]
print arr.transpose((0,1,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]]]
复制代码
数组的运算
大小相等的数组之间做任何算术运算都会将运算应用到元素级别。
复制代码
1 arr = np.arange(9).reshape(3, 3)
2 print arr
3
4 [[0 1 2]
5 [3 4 5]
6 [6 7 8]]
7
8 print arr*arr
9
10 [[ 0 1 4]
11 [ 9 16 25]
12 [36 49 64]]
13
14 print arr+arr
15
16 [[ 0 2 4]
17 [ 6 8 10]
18 [12 14 16]]
19
20 print arr*4
21
22 [[ 0 4 8]
23 [12 16 20]
24 [24 28 32]]
复制代码
numpy的简单计算中,ufunc通用函数是对数组中的数据执行元素级运算的函数。
如:
复制代码
arr = np.arange(6).reshape((2,3))
print arr
[[0 1 2]
[3 4 5]]
print np.square(arr)
[[ 0 1 4]
[ 9 16 25]]
复制代码
类似的有:abs,fabs,sqrt,square,exp,log,sign,ceil,floor,rint,modf,isnan,isfinite,isinf,cos,cosh,sin,sinh,tan,tanh,
add,subtract,multiply,power,mod,equal,等等 参考技术B ndim的维度(数组的维数(即数组轴的个数),等于秩。最常见的为二维数组(矩阵))不是通常矩阵中所说的维度(矩阵多少行多少列),这个矩阵可以被形容为多少行多少列,所以这种程度上来说是2维。当然如果矩阵只有一个数,那么就是1了。nidm的值就是shape函数返回元组的长度
关于Numpy 的一些操作
NumPy是Python语言的一个扩充程序 库。支持高级大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。Numpy内部解除了Python的PIL(全局解释器锁),运算效率极好,是大量机器学习框架的基础库!
Numpy简单创建数组
import numpy as np
# 创建简单的列表
a = [1, 2, 3, 4]
# 将列表转换为数组
b = np.array(b)
Numpy查看数组属性
数组元素个数
b.size
数组形状
b.shape
数组维度
b.ndim
数组元素类型
b.dtype
快速创建N维数组的api函数
-
创建10行10列的数值为浮点1的矩阵
array_one = np.ones([10, 10])
-
创建10行10列的数值为浮点0的矩阵
array_zero = np.zeros([10, 10])
-
从现有的数据创建数组
-
array(深拷贝)
-
asarray(浅拷贝)
-
Numpy创建随机数组np.random
-
均匀分布
-
np.random.rand(10, 10)
创建指定形状(示例为10行10列)的数组(范围在0至1之间) -
np.random.uniform(0, 100)
创建指定范围内的一个数 -
np.random.randint(0, 100)
创建指定范围内的一个整数
-
-
正态分布
给定均值/标准差/维度的正态分布
np.random.normal(1.75, 0.1, (2, 3))
-
数组的索引, 切片
正态生成4行5列的二维数组
? arr = np.random.normal(1.75, 0.1, (4, 5))
? print(arr)
截取第1至2行的第2至3列(从第0行算起)
? after_arr = arr[1:3, 2:4]
? print(after_arr)
数组索引
-
改变数组形状(要求前后元素个数匹配)
改变数组形状
print("reshape函数的使用!")
one_20 = np.ones([20])
print("-->1行20列<--")
print (one_20)
?
one_4_5 = one_20.reshape([4, 5])
print("-->4行5列<--")
print (one_4_5)x
?
Numpy计算(重要)
条件运算
条件判断
import numpy as np
stus_score = np.array([[80, 88], [82, 81], [84, 75], [86, 83], [75, 81]])
stus_score > 80
import numpy as np
stus_score = np.array([[80, 88], [82, 81], [84, 75], [86, 83], [75, 81]])
np.where(stus_score < 80, 0, 90)
统计运算
-
指定轴最大值
amax
(参数1: 数组; 参数2: axis=0/1; 0表示列1表示行) -
求最大值
stus_score = np.array([[80, 88], [82, 81], [84, 75], [86, 83], [75, 81]])
# 求每一列的最大值(0表示列)
print("每一列的最大值为:")
result = np.amax(stus_score, axis=0)
print(result)
?
print("每一行的最大值为:")
result = np.amax(stus_score, axis=1)
print(result)
-
指定轴最小值
amin
-
求最小值
stus_score = np.array([[80, 88], [82, 81], [84, 75], [86, 83], [75, 81]])
# 求每一行的最小值(0表示列)
print("每一列的最小值为:")
result = np.amin(stus_score, axis=0)
print(result)
?
# 求每一行的最小值(1表示行)
print("每一行的最小值为:")
result = np.amin(stus_score, axis=1)
print(result)
-
指定轴平均值
mean
求平均值
stus_score = np.array([[80, 88], [82, 81], [84, 75], [86, 83], [75, 81]])
# 求每一行的平均值(0表示列)
print("每一列的平均值:")
result = np.mean(stus_score, axis=0)
print(result)
?
# 求每一行的平均值(1表示行)
print("每一行的平均值:")
result = np.mean(stus_score, axis=1)
print(result)
-
方差
std
求方差
stus_score = np.array([[80, 88], [82, 81], [84, 75], [86, 83], [75, 81]])
# 求每一行的方差(0表示列)
print("每一列的方差:")
result = np.std(stus_score, axis=0)
print(result)
?
# 求每一行的方差(1表示行)
print("每一行的方差:")
result = np.std(stus_score, axis=1)
print(result)
数组运算
-
数组与数的运算
加法
stus_score = np.array([[80, 88], [82, 81], [84, 75], [86, 83], [75, 81]])
print("加分前:")
print(stus_score)
?
# 为所有平时成绩都加5分
stus_score[:, 0] = stus_score[:, 0]+5
print("加分后:")
print(stus_score)
乘法
stus_score = np.array([[80, 88], [82, 81], [84, 75], [86, 83], [75, 81]])
print("减半前:")
print(stus_score)
?
# 平时成绩减半
stus_score[:, 0] = stus_score[:, 0]*0.5
print("减半后:")
print(stus_score)
-
数组间也支持加减乘除运算,但基本用不到
image.png
a = np.array([1, 2, 3, 4])
b = np.array([10, 20, 30, 40])
c = a + b
d = a - b
e = a * b
f = a / b
print("a+b为", c)
print("a-b为", d)
print("a*b为", e)
print("a/b为", f)
矩阵运算np.dot()
(非常重要)
根据权重计算成绩
-
计算规则
(M行, N列) * (N行, Z列) = (M行, Z列)
矩阵计算总成绩
stus_score = np.array([[80, 88], [82, 81], [84, 75], [86, 83], [75, 81]])
# 平时成绩占40% 期末成绩占60%, 计算结果
q = np.array([[0.4], [0.6]])
result = np.dot(stus_score, q)
print("最终结果为:")
print(result)
-
矩阵拼接
-
矩阵垂直拼接
-
垂直拼接
print("v1为:")
v1 = [[0, 1, 2, 3, 4, 5],
[6, 7, 8, 9, 10, 11]]
print(v1)
print("v2为:")
v2 = [[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]]
print(v2)
# 垂直拼接
result = np.vstack((v1, v2))
print("v1和v2垂直拼接的结果为")
print(result)
-
矩阵水平拼接
-
水平拼接
print("v1为:")
v1 = [[0, 1, 2, 3, 4, 5],
[6, 7, 8, 9, 10, 11]]
print(v1)
print("v2为:")
v2 = [[12, 13, 14, 15, 16, 17],
[18, 19, 20, 21, 22, 23]]
print(v2)
# 垂直拼接
result = np.hstack((v1, v2))
print("v1和v2水平拼接的结果为")
print(result)
Numpy读取数据np.genfromtxt
csv文件以逗号分隔数据
? 读取csv格式的文件
以上是关于python关于numpy基础问题的主要内容,如果未能解决你的问题,请参考以下文章