Python NumPy 学习记录数组操作
Posted 空中旋转篮球
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python NumPy 学习记录数组操作相关的知识,希望对你有一定的参考价值。
1.数组创建
1.1创建数组
import numpy as np
arr=np.array([1,2,3,4,5,6])#1-D数组
arr1=np.array([[1,2],[3,4],[5,6]])#2-D数组
print(arr);print(arr1)
[1 2 3 4 5 6]
[[1 2]
[3 4]
[5 6]]
1.2创建指定大小的数组
分别创建了2*3 2-D数组和2*3*4 3-D数组
n = 2
m = 3
k = 4
matrix = [None] * 2
for i in range(len(matrix)):
matrix[i] = [0] * 3
print(matrix)
for i in range(n):
for j in range(m):
matrix[i][j] = [1] * k
print(matrix)
测试结果如下:
[[0, 0, 0], [0, 0, 0]]
[[[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]], [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 1]]]
方法2:先创建m*n长度的list,然后转化为数组,之后使用reshape方法创建m*n大小的数组,数组里面的值可以设置为0或者None。
2.数组索引
import numpy as np
arr=np.array([1,2,3,4,5,6])#1-D数组
arr1=np.array([[1,2],[3,4],[5,6]])#2-D数组
print(arr[0]);print(arr1[1][1])
1
4
3.数组裁切
python 中裁切的意思是将元素从一个给定的索引带到另一个给定的索引。
裁切格式如:[start:end]。
还可以定义步长,如下所示:[start:end:step]。
如果我们不传递 start,则将其视为 0。
如果我们不传递 end,则视为该维度内数组的长度。
如果我们不传递 step,则视为 1。
import numpy as np
arr=np.array([1,2,3,4,5,6])#1-D数组
arr1=np.array([[1,2],[3,4],[5,6]])#2-D数组
print(arr[1:3]);print(arr[:3]);print(arr[3:])
print("下面两行作用相同")
print(arr[0:6:2])
print(arr[::2])#省略参数,默认从头到尾
print("二维数组裁切")
print(arr1[2:3]);print(arr1[:3]);print(arr1[2:]);print(arr1[0:3:2])
#负裁切
print(arr[-3:-1]);print(arr[-3:]);
print("从第2个元素开始,返回索引为1到4元素")
print(arr1[1, 0:4])#Python语言超出索引了也不报错,就是牛
print("从3个元素中返回索引 ")
print(arr1[0:3, 1])
print(arr1[0:3, 1:4])#这里超出索引了也不报错
[2 3]
[1 2 3]
[4 5 6]
下面两行作用相同
[1 3 5]
[1 3 5]
二维数组裁切
[[5 6]]
[[1 2]
[3 4]
[5 6]]
[[5 6]]
[[1 2]
[5 6]]
[4 5]
[4 5 6]
从第2个元素开始,返回索引为1到4元素
[3 4]
从3个元素中返回索引
[2 4 6]
[[2]
[4]
[6]]
4.数组形状
NumPy 数组有一个名为 shape 的属性,该属性返回一个元组,每个索引具有相应元素的数量。
import numpy as np
arr=np.array([1,2,3,4,5,6])#1-D数组
arr1=np.array([[1,2],[3,4],[5,6]])#2-D数组
print(arr.shape);print(arr1.shape);
print("利用 ndmin 使用值 1,2,3,4,5,6 的向量创建有 3 个维度的数组,并验证最后一个维度的值为6 ")
arr2=np.array([1,2,3,4,5,6],ndmin=3)#1-D数组
print(arr2);print(arr2.shape)
(6,)
(3, 2)
利用 ndmin 使用值 1,2,3,4,5,6 的向量创建有 3 个维度的数组,并验证最后一个维度的值为6
[[[1 2 3 4 5 6]]]
(1, 1, 6)
5.数组重塑
数组重塑就是改变数组的形状
比如将一个1-D数组变为一个2-D数组
import numpy as np
arr=np.array([1,2,3,4,5,6])#1-D数组
arr1=np.array([[1,2],[3,4],[5,6]])#2-D数组
print(arr.reshape(2,3))
print("1-D转化为3-D数组")
print(arr.reshape(2,3,1))
print("把数组转为1-D数组")
print(arr1.reshape(-1))
[[1 2 3]
[4 5 6]]
1-D转化为3-D数组
[[[1]
[2]
[3]]
[[4]
[5]
[6]]]
把数组转为1-D数组
[1 2 3 4 5 6]
6.数组迭代
迭代意味着逐一遍历元素
import numpy as np
arr=np.array([1,2,3,4,5,6])#1-D数组
arr1=np.array([[1,2],[3,4],[5,6]])#2-D数组
arr2=np.array([[[1,2],[3,4]],[[5,6],[7,8]]])#3-D数组
print("迭代一维数组")
for x in arr:
print(x)
print("迭代2维数组")
for x in arr1:
print(x)
for y in x:
print(y)
print("迭代3维数组")
for x in arr2:
for y in x:
for z in y:
print(z)
迭代一维数组
1
2
3
4
5
6
迭代2维数组
[1 2]
1
2
[3 4]
3
4
[5 6]
5
6
迭代3维数组
1
2
3
4
5
6
7
8
迭代函数实例详解
import numpy as np
print("nditer();op_dtypes;ndenumerate()迭代函数参数测试:")
for x in np.nditer(arr2):
print(x)
for x in np.nditer(arr2, flags=['buffered'], op_dtypes=['S']):
print(x)
print("以不同不长迭代")
for x in np.nditer(arr2[:,::2]):
print(x)
print("枚举是指逐一提及事物的序号。有时,我们在迭代时需要元素的相应索引,对于这些用例,可以使用 ndenumerate() 方法")
for x in np.ndenumerate(arr):
print("1-D",x)
for x in np.ndenumerate(arr1):
print("2-D",x)
for x in np.ndenumerate(arr2):
print("3-D",x)
nditer();op_dtypes;ndenumerate()迭代函数参数测试:
1
2
3
4
5
6
7
8
b'1'
b'2'
b'3'
b'4'
b'5'
b'6'
b'7'
b'8'
以不同不长迭代
1
2
5
6
枚举是指逐一提及事物的序号。有时,我们在迭代时需要元素的相应索引,对于这些用例,可以使用 ndenumerate() 方法
((0,), 1)
((1,), 2)
((2,), 3)
((3,), 4)
((4,), 5)
((5,), 6)
((0, 0), 1)
((0, 1), 2)
((1, 0), 3)
((1, 1), 4)
((2, 0), 5)
((2, 1), 6)
((0, 0, 0), 1)
((0, 0, 1), 2)
((0, 1, 0), 3)
((0, 1, 1), 4)
((1, 0, 0), 5)
((1, 0, 1), 6)
((1, 1, 0), 7)
((1, 1, 1), 8)
7.数组连接
数组的连接是将两个或多个数组的内容放在单个数组中。
import numpy as np
arr=np.array([1,2,3,4,5,6])#1-D数组
arr1=np.array([7,8,9,10,11,12])#1-D数组
arr2=np.array([[1,2],[3,4],[5,6]])#2-D数组
arr3=np.array([[7,8],[9,10],[11,12]])#2-D数组
print("使用concatenate()函数连接:")
print(np.concatenate((arr,arr1)))#这个函数用的双括号,不然报错
print("沿着行 (axis=1) 连接两个 2-D 数组")
print(np.concatenate((arr2,arr3),axis=1))#两个数组格式要对称
print("使用堆栈函数连接数组")
print(np.stack((arr,arr1),axis=1))#all input arrays must have the same shape
print("hstack() 函数沿行堆叠")
print(np.hstack((arr,arr1)))
print("vstack() 沿列堆叠")
print(np.vstack((arr,arr1)))
print("dstack() 沿高度堆叠")
print(np.dstack((arr,arr1)))
使用concatenate()函数连接:
[ 1 2 3 4 5 6 7 8 9 10 11 12]
沿着行 (axis=1) 连接两个 2-D 数组
[[ 1 2 7 8]
[ 3 4 9 10]
[ 5 6 11 12]]
使用堆栈函数连接数组
[[ 1 7]
[ 2 8]
[ 3 9]
[ 4 10]
[ 5 11]
[ 6 12]]
hstack() 函数沿行堆叠
[ 1 2 3 4 5 6 7 8 9 10 11 12]
vstack() 沿列堆叠
[[ 1 2 3 4 5 6]
[ 7 8 9 10 11 12]]
dstack() 沿高度堆叠
[[[ 1 7]
[ 2 8]
[ 3 9]
[ 4 10]
[ 5 11]
[ 6 12]]]
8.数组拆分
拆分是连接的反向操作。
import numpy as np
arr=np.array([1,2,3,4,5,6])#1-D数组
arr1=np.array([7,8,9,10,11,12])#1-D数组
arr2=np.array([[1,2],[3,4],[5,6]])#2-D数组
arr3=np.array([[7,8],[9,10],[11,12]])#2-D数组
print("使用array_split()函数拆分数据为多部分")
print(np.array_split(arr,3))
print(np.array_split(arr,4))
print(np.array_split(arr2,3))
print("沿行把 2-D 拆分为三个 2-D 数组。")
print(np.array_split(arr2,3,axis=1))
print("使用 hsplit() 方法将 2-D 数组沿着行分成三个 2-D 数组")
print(np.hsplit(arr2,2))
使用array_split()函数拆分数据为多部分
[array([1, 2]), array([3, 4]), array([5, 6])]
[array([1, 2]), array([3, 4]), array([5]), array([6])]
[array([[1, 2]]), array([[3, 4]]), array([[5, 6]])]
沿行把 2-D 拆分为三个 2-D 数组。
[array([[1],
[3],
[5]]), array([[2],
[4],
[6]]), array([], shape=(3, 0), dtype=int32)]
使用 hsplit() 方法将 2-D 数组沿着行分成三个 2-D 数组
[array([[1],
[3],
[5]]), array([[2],
[4],
[6]])]
9.数组搜索
您可以在数组中搜索(检索)某个值,然后返回获得匹配的索引。
要搜索数组,请使用 where() 方法。
import numpy as np
arr=np.array([1,2,3,4,5,6])#1-D数组
arr1=np.array([7,8,9,10,11,12])#1-D数组
arr2=np.array([[1,2],[3,4],[5,6]])#2-D数组
arr3=np.array([[7,8],[9,10],[11,12]])#2-D数组
print(np.where(arr==4))#查找值为 4 的索引
print(np.where(arr%2==0))#查找偶数索引
print(np.where(arr%2==1))#查找奇数索引
print(np.where(arr2==2))
(array([3], dtype=int64),)
(array([1, 3, 5], dtype=int64),)
(array([0, 2, 4], dtype=int64),)
(array([0], dtype=int64), array([1], dtype=int64))
10.数组过滤
从现有数组中取出一些元素并从中创建新数组称为过滤(filtering)。
在 NumPy 中,我们使用布尔索引列表来过滤数组。
布尔索引列表是与数组中的索引相对应的布尔值列表。
如果索引处的值为 True,则该元素包含在过滤后的数组中;如果索引处的值为 False,则该元素将从过滤后的数组中排除。
import numpy as np
arr=np.array([1,2,3,4,5,6])#1-D数组
arr1=np.array([7,8,9,10,11,12])#1-D数组
arr2=np.array([[1,2],[3,4],[5,6]])#2-D数组
arr3=np.array([[7,8],[9,10],[11,12]])#2-D数组
#过滤器仅包含过滤器数组有值 True 的值,所以在这种情况下,索引为 0 和 2、4。
x = [True, False, True, False, True,True]
print(arr[x])
[1 3 5 6]
10.1创建过滤器数组
import numpy as np
arr=np.array([1,2,3,4,5,6])#1-D数组
arr1=np.array([7,8,9,10,11,12])#1-D数组
# 创建一个空列表
filter_arr = []
for element in arr:
# 如果元素大于 3,则将值设置为 True,否则为 False:
if element > 3:
filter_arr.append(True)
else:
filter_arr.append(False)
print(arr[filter_arr])
[4 5 6]
10.2直接从数组创建过滤器
import numpy as np
arr=np.array([1,2,3,4,5,6])#1-D数组
arr1=np.array([7,8,9,10,11,12])#1-D数组
filter_arr = arr > 3
print(arr[filter_arr])
[4 5 6]
11.数组排序
排序是指将元素按有序顺序排列。
11.1 数序排序
import numpy as np
arr=np.array([1,5,3,7,5,6])#1-D数组
arr1=np.array([7,8,3,10,2,12])#1-D数组
arr2=np.array([[1,2],[7,4],[5,6]])#2-D数组
arr3=np.array([[7,3],[4,10],[8,12]])#2-D数组
arr_bool = np.array([True, False, True])
arr_str = np.array(['banana', 'cherry', 'apple'])
print(np.sort(arr))
print(np.sort(arr1))
print(np.sort(arr2))
print(np.sort(arr3))
print(np.sort(arr_bool))
print(np.sort(arr_str))
[1 3 5 5 6 7]
[ 2 3 7 8 10 12]
[[1 2]
[4 7]
[5 6]]
[[ 3 7]
[ 4 10]
[ 8 12]]
[False True True]
['apple' 'banana' 'cherry']
11.2 倒序排序
numpy里面没有list里面的reverse=true方法
感觉最简单的方法:【Python】在numpy中让一位数组倒序/逆序排列
import numpy as np
arr=np.array([1,5,3,7,5,6])#1-D数组
arr1=np.array([7,8,3,10,2,12])#1-D数组
arr2=np.array([[1,2],[7,4],[5,6]])#2-D数组
arr3=np.array([[7,3],[4,10],[8,12]])#2-D数组
arr_bool = np.array([True, False, True])
arr_str = np.array(['banana', 'cherry', 'apple'])
print(-np.sort(-arr))#加负号
print(-np.sort(-arr1))
print(-np.sort(-arr2))
print(-np.sort(-arr3))
print(-np.sort(-arr_bool))
print(np.sort(arr_str))#字符串的不行
[7 6 5 5 3 1]
[12 10 8 7 3 2]
[[2 1]
[7 4]
[6 5]]
[[ 7 3]
[10 4]
[12 8]]
[ True True False]
['apple' 'banana' 'cherry']
参考:w3school
以上是关于Python NumPy 学习记录数组操作的主要内容,如果未能解决你的问题,请参考以下文章