初探numpy——广播和数组操作函数

Posted lrainner

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了初探numpy——广播和数组操作函数相关的知识,希望对你有一定的参考价值。

numpy广播(Broadcast)

若数组a,b形状相同,即a.shape==b.shape,那么a+b,a*b的结果就是对应数位的运算

import numpy as np

a=np.array([[1,2,3],[4,5,6]])
b=np.array([[1,4,7],[2,5,8]])

print(a+b,‘
‘)
print(a*b)
[[ 2  6 10]
 [ 6 10 14]] 

[[ 1  8 21]
 [ 8 25 48]]

若两个数组形状不同,且有一个数组维度为1,则会触发广播机制

a=np.array([[1,2,3],[4,5,6]])
b=np.array([1,2,3])

# 等同于np.array([[1,2,3],[4,5,6]])与np.array([1,2,3],[1,2,3])运算
print(a+b,‘
‘)
print(a*b)
[[2 4 6]
 [5 7 9]] 

[[ 1  4  9]
 [ 4 10 18]]

numpy数组操作函数

修改数组形状

numpy.reshape()

不改变数据的情况下修改形状

numpy.reshape(array , newshape , order = ‘C‘)
参数 描述
array 要修改形状的数组
newshape 整数或整数数组,新的形状应该兼容原有形状
order ‘C‘——按行,‘F‘——按列,‘A‘——原顺序,‘K‘——元素咋内存中出现的顺序
import numpy as np

a_array=np.arange(16)
print(a_array,‘
‘)

b_array=np.reshape(a_array,[4,4])
print(b_array,‘
‘)

# 也可以打点调用
c_array=a_array.reshape([2,8])
print(c_array)
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15] 

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

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

numpy.ndarray.flat

numpy.ndarray.flat为数组元素迭代器

array=np.arange(9).reshape([3,3])
print(array,‘
‘)

# 按行遍历数组
for row in array:
    print(row)
    
# 使用数组元素迭代器
for element in array.flat:
    print(element)
[[0 1 2]
 [3 4 5]
 [6 7 8]] 

[0 1 2]
[3 4 5]
[6 7 8]
0
1
2
3
4
5
6
7
8

numpy.ndarray.flatten和numpy.ravel

  • numpy扁平化函数
  • numpy.ndarray.flatten返回一份数组拷贝,对拷贝内容的修改不影响原始数值;
  • numpy.ravel返回一个数组的视图,修改视图时会影响原始数组
numpy.ndarray.flatten(order = ‘C‘)
numpy.ravel(order = ‘C‘)
参数 描述
order ‘C‘——按行,‘F‘——按列,‘A‘——原顺序,‘K‘——元素咋内存中出现的顺序
array=np.arange(16).reshape([4,4])
print(array,‘
‘)

print(array.flatten(),‘
‘)
print(array.ravel())
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]] 

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

[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15]
a_array=np.arange(16).reshape([4,4])
print(a_array,‘
‘)

#创建和a_array同样的数组b_array
b_array=a_array.copy()

c_array=a_array.ravel()
d_array=array.flatten()

print(‘c_array:‘)
print(c_array)
print(‘d_array:‘)
print(d_array,‘
‘)

c_array[1]=100
d_array[1]=100

print(‘a_array:‘)
print(a_array)
print(‘b_array:‘)
print(b_array,‘
‘)
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]] 

c_array:
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15]
d_array:
[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15] 

a_array:
[[  0 100   2   3]
 [  4   5   6   7]
 [  8   9  10  11]
 [ 12  13  14  15]]
b_array:
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]] 

翻转数组

transpose和ndarray.T

  • numpy数组转置函数
a_array=np.arange(16).reshape([4,4])
print(‘a_array:
‘,a_array)

print(‘使用transpose后:‘)
print(np.transpose(a_array))
print(‘使用.T转置后:‘)
print(a_array.T)
a_array:
 [[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]
 [12 13 14 15]]
使用transpose后:
[[ 0  4  8 12]
 [ 1  5  9 13]
 [ 2  6 10 14]
 [ 3  7 11 15]]
使用.T转置后:
[[ 0  4  8 12]
 [ 1  5  9 13]
 [ 2  6 10 14]
 [ 3  7 11 15]]

numpy.swapaxes

  • numpy用于交换数组两个轴的函数
numpy.swapaxes(arr , axis1, axis2)
参数 描述
arr 输入数组
axis1 对应数组第一个轴
axis2 对应数组第二个轴
array=np.arange(8).reshape(2,2,2)
print(array)

# 交换第零个轴和第二个轴
print(np.swapaxes(array,0,2))
[[[0 1]
  [2 3]]

 [[4 5]
  [6 7]]]
[[[0 4]
  [2 6]]

 [[1 5]
  [3 7]]]
(0)000->(0)000 (1)001->(4)100
(2)010->(2)010 (3)011->(6)110
(4)100->(1)001 (5)101->(5)101
(6)110->(3)011 (7)111->(7)111

以上是关于初探numpy——广播和数组操作函数的主要内容,如果未能解决你的问题,请参考以下文章

关于Numpy中+=与-=操作符不支持数组广播的特性

是否可以在 Numpy 矢量化广播操作期间访问当前索引?

Numpy 高级

mpi4py 在函数之间广播 numpy 数组

Numpy常用概念-对象的副本和视图向量化广播机制

NumPy基础:数组和失量计算