(四)Python: NumPy中的ndarry

目录

基本概念

基本属性

创建

使用 

方法

操作

运算 

基本运算

方法运算

线性代数运算

ufunc函数


基本概念

维度(dimensions)称为轴 (axes),轴的个数称为秩(rank)。

基本属性

  • ndarray.ndim(秩)
  • ndarray.shape(维度) 
  • ndarray.size(元素总个数) 
  • ndarray.dtype(元素类型) 
  • ndarray.itemsize(元素字节大小)

创建

ndarray的创建可以使用多种创建函数,如下所示,只展示几种常见的创建方法,代码如下所示:

ndarray创建函数
arange array copy empty empty_like eye fromfile fromfunction identity
linspace logspace mgrid ogrid ones random ones_like zeros zeros_like
import numpy as np

g = np.array([1, 2, 3])                     # 用array方法创建了一个一维数组
print(g)
h = np.array([(1, 2, 3), (4, 5, 6)])        # 用array方法创建了一个二维数组
print(h)
print(h.ndim)                               # 输出轴的个数(秩)
print(h.shape)                              # 输出维度
print(h.size)                               # 输出元素总个数
a = np.arange(1, 5, 0.5)                    # 同range类似,步长为0.5,从1到5(不包过5)
print(a)
b = np.random.random((2, 2))                # 随机产生0~1的数字,生成一个维度为(2,2)的数组
print(b)
c = np.linspace(1, 2, 10, endpoint=False)   # 生成1~2之间的数,不包括最后一位
print(c)
d = np.ones([2, 3])                         # 生成维度为(2,3)的全为1的数组
print(d)
e = np.zeros((2, 2))                        # 生成维度为(2,2)的全为0的数组
print(e)
f = np.fromfunction(lambda i, j: (i + 1) * (j + 1), (9, 9)) # 以lambda函数生成一个维度为(9,9)的数组
print(f)

运行结果如下所示:

[1 2 3]
[[1 2 3]
 [4 5 6]]
2
(2, 3)
6
[1.  1.5 2.  2.5 3.  3.5 4.  4.5]
[[0.24045529 0.37604814]
 [0.95796953 0.89254894]]
[1.  1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9]
[[1. 1. 1.]
 [1. 1. 1.]]
[[0. 0.]
 [0. 0.]]
[[ 1.  2.  3.  4.  5.  6.  7.  8.  9.]
 [ 2.  4.  6.  8. 10. 12. 14. 16. 18.]
 [ 3.  6.  9. 12. 15. 18. 21. 24. 27.]
 [ 4.  8. 12. 16. 20. 24. 28. 32. 36.]
 [ 5. 10. 15. 20. 25. 30. 35. 40. 45.]
 [ 6. 12. 18. 24. 30. 36. 42. 48. 54.]
 [ 7. 14. 21. 28. 35. 42. 49. 56. 63.]
 [ 8. 16. 24. 32. 40. 48. 56. 64. 72.]
 [ 9. 18. 27. 36. 45. 54. 63. 72. 81.]]

使用 

方法

对数组进行操作,代码如下:

import numpy as np

a = np.arange(1, 5)                 # 生成1~4
print(a)
print(np.power(a, 2).sum())         # 平方和相加     
print(np.add(a, np.arange(4)))      # 两个数组相加

运行结果如下所示:

[1 2 3 4]
30
[1 3 5 7]

 改变数组,代码如下所示:

import numpy as np

a = np.array([(1, 2, 3), (4, 5, 6)])
print(a.shape)
b = a.reshape(3, 2)             # 复制一个(3,2)的数组,本身未改变
print(b)
print(b.shape)
print(a)
a.resize(3, 2)                  # 将数组本身改变为(3,2)的数组中
print(a)
d = np.array([1, 3, 7])
e = np.array([3, 5, 8])
print(np.vstack((d, e)))        # 纵向拼接
print(np.hstack((d, e)))        # 横向拼接

运行结果如下所示:

(2, 3)


[[1 2]
 [3 4]
 [5 6]]


(3, 2)


[[1 2 3]
 [4 5 6]]


[[1 2]
 [3 4]
 [5 6]]


[[1 3 7]
 [3 5 8]]


[1 3 7 3 5 8]

同样的,改变数组,代码如下:

import numpy as np

x = np.arange(1, 17).reshape(4, 4)      # 生成一个从1~16,(4,4)的数组
print(x)
print(x.reshape(2, -1))                 # 定义成两行随机列
print(x.reshape(-1, 1))                 # 定义成一列随机行

 运行结果如下所示:

定义数组

[[ 1  2  3  4]
 [ 5  6  7  8]
 [ 9 10 11 12]
 [13 14 15 16]]

两行随机列
[[ 1  2  3  4  5  6  7  8]
 [ 9 10 11 12 13 14 15 16]]

一列随机行
[[ 1]
 [ 2]
 [ 3]
 [ 4]
 [ 5]
 [ 6]
 [ 7]
 [ 8]
 [ 9]
 [10]
 [11]
 [12]
 [13]
 [14]
 [15]
 [16]]

操作

ndarry中可以通过一些运算符来操作数组,代码如下所示:

import numpy as np

a = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9], [10, 11, 12]])
print(a)
print(a[0])
print(a[:, [0, 2]])         # 第一列和第三列
print(a[::2])               # 奇数行
print(a[:, ::2])            # 奇数列
print(a[::-1])              # 交换行
print(a[:, ::-1])           #交换列

运行结果如下所示:

本身

[[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]     
 [10 11 12]]

 第一行
[1 2 3]

第一列
[[ 1  3]
 [ 4  6]
 [ 7  9]
 [10 12]]

奇数行
[[1 2 3]
 [7 8 9]]

奇数列
[[ 1  3]
 [ 4  6]
 [ 7  9]
 [10 12]]

交换行
[[10 11 12]
 [ 7  8  9]
 [ 4  5  6]
 [ 1  2  3]]

交换列
[[ 3  2  1]
 [ 6  5  4]
 [ 9  8  7]
 [12 11 10]]

运算 

ndarray中可以使用许多运算函数,并且有许多的运算符,可以便捷的对数组进行操作,代码如下所示:

基本运算

import numpy as np

aArray = np.array([(5, 4, 5), (5, 3, 4)])
bArray = np.array([(2, 3, 2), (2, 4, 2)])
cArray = aArray * bArray                # 数组值相乘
print(cArray)
aArray += bArray                        # 数组值相加
print(aArray)
a = np.array([1, 2, 3])
b = np.array([[1, 2, 3], [4, 5, 6]])
print(a + b)   # 广播性质,自动拓展成相同维度
print(a + 2)   # 同上

运行结果如下所示:

值相乘

[[10 12 10]
 [10 12  8]]

值相加
[[7 7 7]
 [7 7 6]]

广播性质,相加
[[2 4 6]
 [5 7 9]]

广播性质,相加
[3 4 5]

方法运算

import numpy as np

aArray = np.array([(1, 2, 3), (4, 5, 6)])
print(aArray.sum())
print(aArray.sum(axis=0))   # 列求和
print(aArray.sum(axis=1))   # 行求和
print(aArray.min())         # 返回最小值
print(aArray.argmax())      # 返回最大值的索引
print(aArray.mean())        # 返回平均值
print(aArray.var())         # 返回方差
print(aArray.std())         # 返回标准差

运行结果如下所示:

21
[5 7 9]
[ 6 15]
1
5
3.5
2.9166666666666665
1.707825127659933

线性代数运算

import numpy as np

x = np.array([[1, 2], [3, 4]])
r1 = np.linalg.det(x)       # 行列式
print(r1)
r2 = np.linalg.inv(x)       # 逆矩阵
print(r2)
r3 = np.dot(x, x)           # 矩阵内积
print(r3)

运行结果如下所示:

行列式

-2.0000000000000004

逆矩阵
[[-2.   1. ]
 [ 1.5 -0.5]]

矩阵内积
[[ 7 10]
 [15 22]]

 :与scipy的线性运算很像,代码如下:

import numpy as np

from scipy import linalg
arr = np.array([[1, 2], [3, 4]])  
print(linalg.det(arr))              # 行列式

运行结果如下所示:

 -2.0

ufunc函数

ufunc(universal function)是一种能对数组的每个元素进行操作的函数。NumPy内置的许多ufunc函数都是在C语言级别实现的,计算速度非常快。

记得有这个东西就行,好像每快多少,也可能是我用错了

你可能感兴趣的