代码
import numpy as np
print(np.__version__)1.23.5
2026年8月14日
Numpy学习
[1 2 3]
**********
[[1 2]
[3 4]]
[[[[1 2 3 4 5]]]]
(1, 1, 1, 5)
int32
[('name', '<U10'), ('age', '<i4'), ('score', '<f4')]
********************
['Tom' 'Bob']
1
3
1
8
[[0. 1.875]
[0. 2. ]
[0. 2.125]]
[[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]
[0. 0. 0.]]
[[[0 0 0]
[0 0 0]]
[[0 0 0]
[0 0 0]]]
[1 2 3]
********************
[1 2 3]
********************
[(1, 2, 3) (4, 5)]
C:\Users\13422\AppData\Local\Temp\ipykernel_2320\1205389202.py:11: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.
a = np.asarray(x)
[b'H' b'e' b'l' b'l' b'o' b' ' b'W' b'o' b'r' b'l' b'd']
[0. 1. 2. 3. 4.]
[0 1 2 3 4]
[10 12 14 16 18]
# numpy.linspace用于创建一个一维数组,数组是一个等差数列构成的 np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)
a = np.linspace(1,10,10)
print(a)
print("*"*20)
a = np.linspace(1,1,10)
print(a)
print("*"*20)
a = np.linspace(10, 20, 5, endpoint = False) # 将 endpoint 设为 false,不包含终止值
print(a)
print("*"*20)
a = np.linspace(10, 20, 5, endpoint = True, retstep= True) # retstep= True 可以看到间距
print(a)[ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.]
********************
[1. 1. 1. 1. 1. 1. 1. 1. 1. 1.]
********************
[10. 12. 14. 16. 18.]
********************
(array([10. , 12.5, 15. , 17.5, 20. ]), 2.5)
[ 10. 12.91549665 16.68100537 21.5443469 27.82559402
35.93813664 46.41588834 59.94842503 77.42636827 100. ]
[ 1. 2. 4. 8. 16. 32. 64. 128. 256. 512.]
# slice 切割出一个新的数组
a = np.arange(10)
s = slice(2,7,2) # 从索引 2 开始到索引 7 停止,间隔为2
print (a[s])
print("*"*20)
# 实际上没有必要这么麻烦
a = np.arange(10)
b = a[2:7:1] # 从索引 2 开始到索引 7 停止,间隔为 1
print(b)
print("*"*20)
# 多维数组
a = np.array([[1,2,3],[3,4,5],[4,5,6]])
print(a)
# 从某个索引处开始切割
print('从数组索引 a[1:] 处开始切割')
print(a[1:])
print("*"*20)
#切片还可以包括省略号 …,来使选择元组的长度与数组的维度相同。
print (a[...,1]) # 第2列元素[2 4 6]
********************
[2 3 4 5 6]
********************
[[1 2 3]
[3 4 5]
[4 5 6]]
从数组索引 a[1:] 处开始切割
[[3 4 5]
[4 5 6]]
********************
[2 4 5]
# 整数数组索引是指使用一个数组来访问另一个数组的元素。这个数组中的每个元素都是目标数组中某个维度上的索引值。
# 以下实例获取数组中 (0,0),(1,1) 和 (2,0) 位置处的元素。
x = np.array([[1, 2], [3, 4], [5, 6]])
y = x[[0,1,2], [0,1,0]]
print (y)
print("*"*20)
x = np.array([[ 0, 1, 2],[ 3, 4, 5],[ 6, 7, 8],[ 9, 10, 11]])
print ('我们的数组是:' )
print (x)
print ('\n')
rows = np.array([[0,0],[3,3]])
cols = np.array([[0,2],[0,2]])
y = x[rows,cols]
print ('这个数组的四个角元素是:')
print (y)[1 4 5]
********************
我们的数组是:
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
这个数组的四个角元素是:
[[ 0 2]
[ 9 11]]
我们的数组是:
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]]
大于 5 的元素是:
[ 6 7 8 9 10 11]
[0 1 2 3 4 5 6 7 8]
-------读取下标对应的元素-------
[0 6]
0
6
[[ 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]]
-------读取下标对应的行-------
[[16 17 18 19]
[ 8 9 10 11]
[ 4 5 6 7]
[28 29 30 31]]
[[ 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 7 5 6]
[20 23 21 22]
[28 31 29 30]
[ 8 11 9 10]]
[[ 0 1 2]
[10 11 12]
[20 21 22]
[30 41 52]
[30 51 62]]
# 迭代器numpy.nditer
a = np.arange(6).reshape(2,3)
print ('原始数组是:')
print (a)
print ('\n')
print ('迭代输出元素:')
for x in np.nditer(a): # np.nditer(a, order='F') or np.nditer(a.T, order='C') F是列序优先,C是行序优先,默认为C
print (x, end=", " )
print ('\n')
for x in np.nditer(a, order='F'):
print (x, end=", " )
print ('\n')
for x in iter(a):
print(x, end=", ")原始数组是:
[[0 1 2]
[3 4 5]]
迭代输出元素:
0, 1, 2, 3, 4, 5,
0, 3, 1, 4, 2, 5,
[0 1 2], [3 4 5],
原始数组:
[0 1 2]
[3 4 5]
[6 7 8]
迭代后的数组:
0
1
2
3
4
5
6
7
8
# numpy.ndarray.flatten 返回一份数组拷贝,对拷贝所做的修改不会影响原始数组
# order:'C' -- 按行,'F' -- 按列,'A' -- 原顺序,'K' -- 元素在内存中的出现顺序。
a = np.arange(8).reshape(2,4)
print ('原数组:')
print (a)
print ('\n')
# 默认按行
print ('展开的数组:')
print (a.flatten())
print ('\n')
print ('以 F 风格顺序展开的数组:')
print (a.flatten(order = 'F'))
# numpy.ravel 作用一致,但是返回的是数组视图,修改会影响原始数组,即二者内存一致。原数组:
[[0 1 2 3]
[4 5 6 7]]
展开的数组:
[0 1 2 3 4 5 6 7]
以 F 风格顺序展开的数组:
[0 4 1 5 2 6 3 7]
原数组:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
对换数组:
[[ 0 4 8]
[ 1 5 9]
[ 2 6 10]
[ 3 7 11]]
# numpy.rollaxis 函数向后滚动特定的轴到一个特定位置
a = np.arange(8).reshape(2,2,2)
print ('原数组:')
print (a)
print ('获取数组中一个值:')
print(np.where(a==6))
print(a[1,1,0]) # 为 6
print ('\n')
# 将轴 2 滚动到轴 0(宽度到深度)
print ('调用 rollaxis 函数:')
b = np.rollaxis(a,2,0)
print (b)
# 查看元素 a[1,1,0],即 6 的坐标,变成 [0, 1, 1]
# 最后一个 0 移动到最前面
print(np.where(b==6))
print ('\n')
# 将轴 2 滚动到轴 1:(宽度到高度)
print ('调用 rollaxis 函数:')
c = np.rollaxis(a,2,1)
print (c)
# 查看元素 a[1,1,0],即 6 的坐标,变成 [1, 0, 1]
# 最后的 0 和 它前面的 1 对换位置
print(np.where(c==6))
print ('\n')原数组:
[[[0 1]
[2 3]]
[[4 5]
[6 7]]]
获取数组中一个值:
(array([1], dtype=int64), array([1], dtype=int64), array([0], dtype=int64))
6
调用 rollaxis 函数:
[[[0 2]
[4 6]]
[[1 3]
[5 7]]]
(array([0], dtype=int64), array([1], dtype=int64), array([1], dtype=int64))
调用 rollaxis 函数:
[[[0 2]
[1 3]]
[[4 6]
[5 7]]]
(array([1], dtype=int64), array([0], dtype=int64), array([1], dtype=int64))
# numpy.expand_dims 函数通过在指定位置插入新的轴来扩展数组形状
x = np.array(([1,2],[3,4]))
print ('数组 x:')
print (x)
print ('\n')
y = np.expand_dims(x, axis = 0)
print ('数组 y:')
print (y)
print ('\n')
print ('数组 x 和 y 的形状:')
print (x.shape, y.shape)
print ('\n')
# 在位置 1 插入轴
y = np.expand_dims(x, axis = 1)
print ('在位置 1 插入轴之后的数组 y:')
print (y)
print ('\n')
print ('x.ndim 和 y.ndim:')
print (x.ndim,y.ndim)
print ('\n')
print ('x.shape 和 y.shape:')
print (x.shape, y.shape)
# numpy.squeeze 函数从给定数组的形状中删除一维的条目,函数格式如下:数组 x:
[[1 2]
[3 4]]
数组 y:
[[[1 2]
[3 4]]]
数组 x 和 y 的形状:
(2, 2) (1, 2, 2)
在位置 1 插入轴之后的数组 y:
[[[1 2]]
[[3 4]]]
x.ndim 和 y.ndim:
2 3
x.shape 和 y.shape:
(2, 2) (2, 1, 2)
# numpy.concatenate 函数用于沿指定轴连接相同形状的两个或多个数组
# numpy.concatenate((a1, a2, ...), axis)
a = np.array([[1,2],[3,4]])
print ('第一个数组:')
print (a)
print ('\n')
b = np.array([[5,6],[7,8]])
print ('第二个数组:')
print (b)
print ('\n')
# 两个数组的维度相同
print ('沿轴 0 连接两个数组:')
print (np.concatenate((a,b)))
print ('\n')
print ('沿轴 1 连接两个数组:')
print (np.concatenate((a,b),axis = 1))
# numpy.hstack 是 numpy.concatenate 的便捷封装,用于沿着第二轴(axis=1)水平堆叠数组。
# numpy.vstack 是 numpy.concatenate 的便捷封装,用于沿着第一轴(axis=0)垂直堆叠数组。第一个数组:
[[1 2]
[3 4]]
第二个数组:
[[5 6]
[7 8]]
沿轴 0 连接两个数组:
[[1 2]
[3 4]
[5 6]
[7 8]]
沿轴 1 连接两个数组:
[[1 2 5 6]
[3 4 7 8]]
# numpy.split 函数沿特定的轴将数组分割为子数组 numpy.split(ary, indices_or_sections, axis)多维度可以在aixs设置轴
a = np.arange(9)
print ('第一个数组:')
print (a)
print ('\n')
print ('将数组分为三个大小相等的子数组:')
b = np.split(a,3)
print (b)
print ('\n')
print ('将数组在一维数组中表明的位置分割:')
b = np.split(a,[4,7])
print (b)
# numpy.hsplit 函数用于水平分割数组,通过指定要返回的相同形状的数组数量来拆分原数组。
# numpy.vsplit 沿着垂直轴分割,其分割方式与hsplit用法相同。第一个数组:
[0 1 2 3 4 5 6 7 8]
将数组分为三个大小相等的子数组:
[array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8])]
将数组在一维数组中表明的位置分割:
[array([0, 1, 2, 3]), array([4, 5, 6]), array([7, 8])]
# numpy.resize 函数返回指定大小的新数组。
a = np.array([[1,2,3],[4,5,6]])
print ('第一个数组:')
print (a)
print ('\n')
print ('第一个数组的形状:')
print (a.shape)
print ('\n')
b = np.resize(a, (3,2))
print ('第二个数组:')
print (b)
print ('\n')
print ('第二个数组的形状:')
print (b.shape)
print ('\n')
# 要注意 a 的第一行在 b 中重复出现,因为尺寸变大了
print ('修改第二个数组的大小:')
b = np.resize(a,(3,3))
print (b)第一个数组:
[[1 2 3]
[4 5 6]]
第一个数组的形状:
(2, 3)
第二个数组:
[[1 2]
[3 4]
[5 6]]
第二个数组的形状:
(3, 2)
修改第二个数组的大小:
[[1 2 3]
[4 5 6]
[1 2 3]]
# numpy.append函数在数组的末尾添加值。 追加操作会分配整个数组,并把原来的数组复制到新数组中。 此外,输入数组的维度必须匹配否则将生成ValueError。
a = np.array([[1,2,3],[4,5,6]])
print ('第一个数组:')
print (a)
print ('\n')
print ('向数组添加元素:')
print (np.append(a, [7,8,9]))
print ('\n')
print ('沿轴 0 添加元素:')
print (np.append(a, [[7,8,9]],axis = 0))
print ('\n')
print ('沿轴 1 添加元素:')
print (np.append(a, [[5,5,5],[7,8,9]],axis = 1))
# numpy.insert 函数在给定索引之前,沿给定轴在输入数组中插入值。
# numpy.delete 函数返回从输入数组中删除指定子数组的新数组。 这两个函数如果未提供轴参数,则输入数组将展开。第一个数组:
[[1 2 3]
[4 5 6]]
向数组添加元素:
[1 2 3 4 5 6 7 8 9]
沿轴 0 添加元素:
[[1 2 3]
[4 5 6]
[7 8 9]]
沿轴 1 添加元素:
[[1 2 3 5 5 5]
[4 5 6 7 8 9]]
# numpy.unique 函数用于去除数组中的重复元素。 numpy.unique(arr, return_index, return_inverse, return_counts)
# arr:输入数组,如果不是一维数组则会展开
# return_index:如果为true,返回新列表元素在旧列表中的位置(下标),并以列表形式储
# return_inverse:如果为true,返回旧列表元素在新列表中的位置(下标),并以列表形式储
# return_counts:如果为true,返回去重数组中的元素在原数组中的出现次数
a = np.array([5,2,6,2,7,5,6,8,2,9])
print ('第一个数组:')
print (a)
print ('\n')
print ('第一个数组的去重值:')
u = np.unique(a)
print (u)
print ('\n')
print ('去重数组的索引数组:')
u,indices = np.unique(a, return_index = True)
print (indices)
print ('\n')
print ('我们可以看到每个和原数组下标对应的数值:')
print (a)
print ('\n')
print ('去重数组的下标:')
u,indices = np.unique(a,return_inverse = True)
print (u)
print ('\n')
print ('下标为:')
print (indices)
print ('\n')
第一个数组:
[5 2 6 2 7 5 6 8 2 9]
第一个数组的去重值:
[2 5 6 7 8 9]
去重数组的索引数组:
[1 0 2 4 7 9]
我们可以看到每个和原数组下标对应的数值:
[5 2 6 2 7 5 6 8 2 9]
去重数组的下标:
[2 5 6 7 8 9]
下标为:
[1 0 2 0 3 1 2 4 0 5]
使用下标重构原数组:
[5 2 6 2 7 5 6 8 2 9]
返回去重元素的重复数量:
[2 5 6 7 8 9]
[3 2 2 1 1 1]
# 位运算
import numpy as np
arr1 = np.array([True, False, True], dtype=bool)
arr2 = np.array([False, True, False], dtype=bool)
result_and = np.bitwise_and(arr1, arr2) # 与
result_or = np.bitwise_or(arr1, arr2) # 或
result_xor = np.bitwise_xor(arr1, arr2) # 异或
result_not = np.bitwise_not(arr1) # 取反
print("AND:", result_and) # [False, False, False]
print("OR:", result_or) # [True, True, True]
print("XOR:", result_xor) # [True, True, True]
print("NOT:", result_not) # [False, True, False]
# 按位取反
arr_invert = np.invert(np.array([1, 2], dtype=np.int8)) # int8对应8位, 1 代表 00000001 ,取反变为11111110 对应-2 或者说invert(x) = -(x+1)
print("Invert:", arr_invert) # [-2, -3] 注意dtype的类型
# 左移位运算
arr_left_shift = np.left_shift(5, 2) # 从101->10100 从5->20
print("Left Shift:", arr_left_shift) # 20
# 右移位运算
arr_right_shift = np.right_shift(10, 1) # 从1010->0101 从10->5
print("Right Shift:", arr_right_shift) # 5AND: [False False False]
OR: [ True True True]
XOR: [ True True True]
NOT: [False True False]
Invert: [-2 -3]
Left Shift: 20
Right Shift: 5
连接两个字符串:
['hello xyz']
连接示例:
['hello abc' 'hi xyz']
SBLSR SBLSR SBLSR SBLSR SBLSR
# numpy.char.center() 函数用于将字符串居中,并使用指定字符在左侧和右侧进行填充。
print (np.char.center('Runoob', 20,fillchar = '*'))
# numpy.char.capitalize() 函数将字符串的第一个字母转换为大写:
# numpy.char.title() 函数将字符串的每个单词的第一个字母转换为大写:
# numpy.char.lower() 函数对数组的每个元素转换为小写。它对每个元素调用 str.lower。
# numpy.char.upper() 函数对数组的每个元素转换为大写。它对每个元素调用 str.upper。
# numpy.char.split() 通过指定分隔符对字符串进行分割,并返回数组。默认情况下,分隔符为空格。
# numpy.char.splitlines() 函数以换行符作为分隔符来分割字符串,并返回数组。 \n,\r,\r\n 都可用作换行符。
# numpy.char.strip() 函数用于移除开头或结尾处的特定字符。
# numpy.char.join() 函数通过指定分隔符来连接数组中的元素或字符串
# numpy.char.replace() 函数使用新字符串替换字符串中的所有子字符串。*******Runoob*******
原数组:
[ 1. 5.55 123. 0.567 25.532]
舍入后:
[ 1. 6. 123. 1. 26.]
[ 1. 5.6 123. 0.6 25.5]
[ 0. 10. 120. 0. 30.]
提供的数组:
[-1.7 1.5 -0.2 0.6 10. ]
修改后的数组:
[-2. 1. -1. 0. 10.]
提供的数组:
[-1.7 1.5 -0.2 0.6 10. ]
修改后的数组:
[-1. 2. -0. 1. 10.]
# numpy.amin() 用于计算数组中的元素沿指定轴的最小值。
a = np.array([[3,7,5],[8,4,3],[2,4,9]])
print ('我们的数组是:')
print (a)
print ('\n')
print ('调用 amin() 函数:')
print (np.amin(a, 1))
print ('\n')
print ('再次调用 amin() 函数:')
print (np.amin(a, 0))
print ('\n')
print ('调用 amax() 函数:')
print (np.amax(a))
print ('\n')
print ('再次调用 amax() 函数:')
print (np.amax(a, axis = 0))我们的数组是:
[[3 7 5]
[8 4 3]
[2 4 9]]
调用 amin() 函数:
[3 3 2]
再次调用 amin() 函数:
[2 4 3]
调用 amax() 函数:
9
再次调用 amax() 函数:
[8 7 9]
# 简单的赋值不会创建数组对象的副本。 相反,它使用原始数组的相同id()来访问它。 id()返回 Python 对象的通用标识符,类似于 C 中的指针。
# 此外,一个数组的任何变化都反映在另一个数组上。 例如,一个数组的形状改变也会改变另一个数组的形状。
a = np.arange(6)
print ('我们的数组是:')
print (a)
print ('调用 id() 函数:')
print (id(a))
print ('a 赋值给 b:')
b = a
print (b)
print ('b 拥有相同 id():')
print (id(b))
print ('修改 b 的形状:')
b.shape = 3,2
print (b)
print ('a 的形状也修改了:')
print (a)我们的数组是:
[0 1 2 3 4 5]
调用 id() 函数:
2545648018416
a 赋值给 b:
[0 1 2 3 4 5]
b 拥有相同 id():
2545648018416
修改 b 的形状:
[[0 1]
[2 3]
[4 5]]
a 的形状也修改了:
[[0 1]
[2 3]
[4 5]]
# ndarray.view() 方会创建一个新的数组对象,该方法创建的新数组的维数变化不会改变原始数据的维数。
# 最开始 a 是个 3X2 的数组
a = np.arange(6).reshape(3,2)
print ('数组 a:')
print (a)
print ('创建 a 的视图:')
b = a.view()
print (b)
print ('两个数组的 id() 不同:')
print ('a 的 id():')
print (id(a))
print ('b 的 id():' )
print (id(b))
# 修改 b 的形状,并不会修改 a
b.shape = 2,3
print ('b 的形状:')
print (b)
print ('a 的形状:')
print (a)
# 使用切片创建视图修改数据会影响到原始数组数组 a:
[[0 1]
[2 3]
[4 5]]
创建 a 的视图:
[[0 1]
[2 3]
[4 5]]
两个数组的 id() 不同:
a 的 id():
2545648018224
b 的 id():
2545647689520
b 的形状:
[[0 1 2]
[3 4 5]]
a 的形状:
[[0 1]
[2 3]
[4 5]]
# ndarray.copy() 函数创建一个副本。 对副本数据进行修改,不会影响到原始数据,它们物理内存不在同一位置。
a = np.array([[10,10], [2,3], [4,5]])
print ('数组 a:')
print (a)
print ('创建 a 的深层副本:')
b = a.copy()
print ('数组 b:')
print (b)
# b 与 a 不共享任何内容
print ('我们能够写入 b 来写入 a 吗?')
print (b is a)
print ('修改 b 的内容:')
b[0,0] = 100
print ('修改后的数组 b:')
print (b)
print ('a 保持不变:')
print (a)数组 a:
[[10 10]
[ 2 3]
[ 4 5]]
创建 a 的深层副本:
数组 b:
[[10 10]
[ 2 3]
[ 4 5]]
我们能够写入 b 来写入 a 吗?
False
修改 b 的内容:
修改后的数组 b:
[[100 10]
[ 2 3]
[ 4 5]]
a 保持不变:
[[10 10]
[ 2 3]
[ 4 5]]
[[37 40]
[85 92]]
130
2
[[[[ 9 11]
[ 13 15]]
[[ 43 53]
[ 63 73]]]
[[[ 77 95]
[113 131]]
[[111 137]
[163 189]]]]