numpy基本操作(5):数组操作

1.修改数组形状

函数 描述
reshape 不改变数据的条件下修改形状
flat 数组元素迭代器
flatten 返回一份数组拷贝,对拷贝所做的修改不会影响原始数组
ravel 返回展开数组
import numpy as np

#numpy.reshape函数可以在不改变数据的条件下修改形状
# numpy.reshape(arr, newshape, order='C')
a=np.arange(8)
print(a)
b=a.reshape(4,2)
print(b)
#[0 1 2 3 4 5 6 7]
#[[0 1]
# [2 3]
# [4 5]
# [6 7]]

#numpy.ndarray.flat 是一个数组元素迭代器
a=np.arange(9).reshape(3,3)
for row in a:
    print(row)
#[0 1 2]
#[3 4 5]
#[6 7 8]

for element in a.flat:
    print(element)
#0
#1
#2
#3
#4
#5
#6
#7
#8

#numpy.ndarray.flatten 返回一份数组拷贝,对拷贝所做的修改不会影响原始数组
a=np.arange(8).reshape(2,4)
print(a)
print("\n")
#[[0 1 2 3]
# [4 5 6 7]]
print(a.flatten())
print("\n")
#[0 1 2 3 4 5 6 7]
print(a.flatten(order="F"))
#[0 4 1 5 2 6 3 7]    

#numpy.ravel()展平的数组元素,顺序通常是"C风格",返回的是数组视图修改会影响原始数组.该函数接收两个参数:
a=np.arange(8).reshape(2,4)
print(a)
print("\n")
#[[0 1 2 3]
# [4 5 6 7]]
print(a.ravel())
print("\n")
#[0 1 2 3 4 5 6 7]
print(a.ravel(order="F"))
#[0 4 1 5 2 6 3 7]

2.翻转数组

函数 描述
transpose 对换数组的维度
ndarray.T 和 self.transpose() 相同
rollaxis 向后滚动指定的轴
swapaxes 对换数组的两个轴
import numpy as np

#numpy.transpose 函数用于对换数组的维度,格式如下:numpy.transpose(arr, axes)
a=np.arange(12).reshape(3,4)
print(a)
print("\n")
print(np.transpose(a))#prine(a.transpose())
#[[ 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.ndarray.T 类似 numpy.transpose:
a = np.arange(12).reshape(3,4)
print (a)
print ('\n')
print (a.T)
#[[ 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函数向后滚动特定的轴到一个特定位置,格式如下numpy.rollaxis(arr, axis, start)
a = np.arange(8).reshape(2,2,2)
print(a)
print("\n")
#[[[0 1]
#  [2 3]]
#
# [[4 5]
#  [6 7]]]
print(np.rollaxis(a,2))
print("\n")
#[[[0 2]
#  [4 6]]
#
# [[1 3]
#  [5 7]]]
print(np.rollaxis(a,2,1))
#[[[0 2]
#  [1 3]]
#
# [[4 6]
#  [5 7]]]

#numpy.swapaxes 函数用于交换数组的两个轴,格式如下:numpy.swapaxes(arr, axis1, axis2)
a = np.arange(8).reshape(2,2,2)
print(a)
print("\n")
#[[[0 1]
#  [2 3]]
#
# [[4 5]
#  [6 7]]]
print (np.swapaxes(a, 2, 0))
#[[[0 4]
#  [2 6]]
#
# [[1 5]
#  [3 7]]]

3.修改数组维度

维度 描述
broadcast 产生模仿广播的对象
broadcast_to 将数组广播到新形状
expand_dims 扩展数组的形状
squeeze 从数组的形状中删除一维条目
import numpy as np

#numpy.broadcast用于模仿广播的对象,它返回一个对象,该对象封装了将一个数组广播到另一个数组的结果。
x = np.array([[1], [2], [3]])
y = np.array([4, 5, 6]) 
b=np.broadcast(x,y)
r,c=b.iters
print(next(r),next(c))
print(next(r),next(c))
print("\n")
#1 4
#1 5
print(b.shape)
#(3, 3)
# 手动使用 broadcast 将 x 与 y 相加
b = np.broadcast(x,y)
c=np.empty(b.shape)
print(c.shape)
c.flat=[u+v for (u,v) in b]
print(c)
#(3, 3)
#[[5. 6. 7.]
# [6. 7. 8.]
# [7. 8. 9.]]

# 获得了和 NumPy 内建的广播支持相同的结果
print (x + y)
#[[5 6 7]
# [6 7 8]
# [7 8 9]]

#numpy.broadcast_to 函数将数组广播到新形状。它在原始数组上返回只读视图.它通常不连续.
#如果新形状不符合 NumPy的广播规则,该函数可能会抛出ValueError.numpy.broadcast_to(array, shape, subok)
a = np.arange(4).reshape(1,4)
print (a)
print (np.broadcast_to(a,(4,4)))
#[[0 1 2 3]]
#[[0 1 2 3]
# [0 1 2 3]
# [0 1 2 3]
# [0 1 2 3]]

#numpy.expand_dims函数通过在指定位置插入新的轴来扩展数组形状,函数格式如下:numpy.expand_dims(arr, axis)
x = np.array(([1,2],[3,4]))
print(x)
print(x.shape)
y=np.expand_dims(x,axis=0)
print(y)
print(y.shape)
#[[1 2]
# [3 4]]
#(2, 2)
#[[[1 2]
#  [3 4]]]
#(1, 2, 2)

y = np.expand_dims(x, axis = 1)
print (y)
print(y.shape)
#[[[1 2]]
#
# [[3 4]]]
#(2, 1, 2)


#numpy.squeeze函数从给定数组的形状中删除一维的条目,函数格式如下:numpy.squeeze(arr, axis)
x = np.arange(9).reshape(1,3,3)
print(x)
print(x.shape)
y=np.squeeze(x)
print(y)
print(y.shape)
#[[[0 1 2]
#  [3 4 5]
#  [6 7 8]]]
#(1, 3, 3)
#[[0 1 2]
# [3 4 5]
# [6 7 8]]
#(3, 3)

 4.连接数组

函数 描述
concatenate 连接沿现有轴的数组序列
stack 沿着新的轴加入一系列数组。
hstack 水平堆叠序列中的数组(列方向)
vstack 竖直堆叠序列中的数组(行方向)
#numpy.concatenate函数用于沿指定轴连接相同形状的两个或多个数组,numpy.concatenate((a1, a2, ...), axis)
a = np.array([[1,2],[3,4]])
print (a)
#[[1 2]
# [3 4]]
b = np.array([[5,6],[7,8]])
print (b)
#[[5 6]
# [7 8]]
print (np.concatenate((a,b)))
#[[1 2]
# [3 4]
# [5 6]
# [7 8]]
print (np.concatenate((a,b),axis = 1))
#[[1 2 5 6]
# [3 4 7 8]]

#numpy.stack 函数用于沿新轴连接数组序列,格式如下:numpy.stack(arrays, axis)
a = np.array([[1,2],[3,4]])
print(a)
#[[1 2]
# [3 4]]
b = np.array([[5,6],[7,8]])
print (b)
#[[5 6]
# [7 8]]
print (np.stack((a,b),0))
#[[[1 2]
#  [3 4]]
#
# [[5 6]
#  [7 8]]]
print (np.stack((a,b),1))
#[[[1 2]
#  [5 6]]
#
# [[3 4]
#  [7 8]]]

#numpy.hstack 是 numpy.stack 函数的变体,它通过水平堆叠来生成数组。
a = np.array([[1,2],[3,4]])
print (a)
#[[1 2]
# [3 4]]
b = np.array([[5,6],[7,8]])
print (b)
#[[5 6]
# [7 8]]
c = np.hstack((a,b))
print (c)
#[[1 2 5 6]
# [3 4 7 8]]

#numpy.vstack 是 numpy.stack 函数的变体,它通过垂直堆叠来生成数组。
a = np.array([[1,2],[3,4]])
print (a)
#[[1 2]
# [3 4]]
b = np.array([[5,6],[7,8]])
print (b)
#[[5 6]
# [7 8]]
c = np.vstack((a,b))
print (c)
#[[1 2]
# [3 4]
# [5 6]
# [7 8]]

 5.分割数组

函数 数组及操作
split 将一个数组分割为多个子数组
hsplit 将一个数组水平分割为多个子数组(按列)
vsplit 将一个数组垂直分割为多个子数组(按行)
import numpy as np

#numpy.split 函数沿特定的轴将数组分割为子数组,格式如下:
#numpy.split(ary, indices_or_sections, axis)
#indices_or_sections:果是一个整数,就用该数平均切分,如果是一个数组,为沿轴切分的位置(左开右闭)
#axis:沿着哪个维度进行切向,默认为0,横向切分。为1时,纵向切分
a = np.arange(9)
print (a) 
#将数组分为三个大小相等的子数组
b = np.split(a,3)
print (b)
#将数组在一维数组中表明的位置分割
b = np.split(a,[4,7])
print (b)
#[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.hsplit 函数用于水平分割数组,通过指定要返回的相同形状的数组数量来拆分原数组。
harr = np.floor(10 * np.random.random((2, 6)))
print(harr)
print(np.hsplit(harr, 3))
#[[7. 4. 7. 9. 1. 9.]
# [0. 3. 5. 7. 6. 1.]]
#[array([[7., 4.],
#       [0., 3.]]), array([[7., 9.],
#       [5., 7.]]), array([[1., 9.],
#       [6., 1.]])]

#numpy.vsplit 沿着垂直轴分割,其分割方式与hsplit用法相同。
a = np.arange(16).reshape(4,4)
print (a)
b = np.vsplit(a,2)
print (b)
#[[ 0  1  2  3]
# [ 4  5  6  7]
# [ 8  9 10 11]
# [12 13 14 15]]
#[array([[0, 1, 2, 3],
#       [4, 5, 6, 7]]), array([[ 8,  9, 10, 11],
#       [12, 13, 14, 15]])]

 6.数组元素的添加与删除

函数 元素及描述
resize 返回指定形状的新数组
append 将值添加到数组末尾
insert 沿指定轴将值插入到指定下标之前
delete 删掉某个轴的子数组,并返回删除后的新数组
unique 查找数组内的唯一元素
import numpy as np

#numpy.resize 函数返回指定大小的新数组。
#如果新数组大小大于原始大小,则包含原始数组中的元素的副本。
#numpy.resize(arr, shape)

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

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

#numpy.append 函数在数组的末尾添加值。 追加操作会分配整个数组,并把原来的数组复制到新数组中。
#此外,输入数组的维度必须匹配否则将生成ValueError。
#append 函数返回的始终是一个一维数组。
a = np.array([[1,2,3],[4,5,6]])
print (a)
#[[1 2 3]
# [4 5 6]]
print (np.append(a, [7,8,9]))
#[1 2 3 4 5 6 7 8 9]
print (np.append(a, [[7,8,9]],axis = 0))
#[[1 2 3]
# [4 5 6]
# [7 8 9]]
print (np.append(a, [[5,5,5],[7,8,9]],axis = 1))
#[[1 2 3 5 5 5]
# [4 5 6 7 8 9]]

#numpy.insert 函数在给定索引之前,沿给定轴在输入数组中插入值。
#如果值的类型转换为要插入,则它与输入数组不同。 插入没有原地的,函数会返回一个新数组。
# 此外,如果未提供轴,则输入数组会被展开。
#numpy.insert(arr, obj, values, axis)
import numpy as np
 
a = np.array([[1,2],[3,4],[5,6]])
print (a)
#[[1 2]
# [3 4]
# [5 6]]
print (np.insert(a,3,[11,12]))
#[ 1  2  3 11 12  4  5  6]

#传递了 Axis 参数。 会广播值数组来配输入数组
print (np.insert(a,1,[11],axis = 0))
#[[ 1  2]
# [11 11]
# [ 3  4]
# [ 5  6]]
print (np.insert(a,1,11,axis = 1))
#[[ 1 11  2]
# [ 3 11  4]
# [ 5 11  6]]


#numpy.delete 函数返回从输入数组中删除指定子数组的新数组。 
#与 insert() 函数的情况一样,如果未提供轴参数,则输入数组将展开。
#Numpy.delete(arr, obj, axis)
a = np.arange(12).reshape(3,4)
print (a)
#[[ 0  1  2  3]
# [ 4  5  6  7]
# [ 8  9 10 11]]
#未传递 Axis 参数。 在插入之前输入数组会被展开。
print (np.delete(a,5))
#[ 0  1  2  3  4  6  7  8  9 10 11]
#删除第二列
print (np.delete(a,1,axis = 1))
#[[ 0  2  3]
# [ 4  6  7]
# [ 8 10 11]]
#包含从数组中删除的替代值的切片
a = np.array([1,2,3,4,5,6,7,8,9,10])
print (np.delete(a, np.s_[::2]))
#[ 2  4  6  8 10]

#numpy.unique 函数用于去除数组中的重复元素。
#numpy.unique(arr, return_index, return_inverse, return_counts)
a = np.array([5,2,6,2,7,5,6,8,2,9])
print (a)
#[5 2 6 2 7 5 6 8 2 9]
u = np.unique(a)
print (u)
#[2 5 6 7 8 9]

#去重数组的索引数组
u,indices = np.unique(a, return_index = True)
print (indices)
#[1 0 2 4 7 9]

#我们可以看到每个和原数组下标对应的数值
u,indices = np.unique(a,return_inverse = True)
print (u)
print (indices)
#[2 5 6 7 8 9]
#[1 0 2 0 3 1 2 4 0 5]
#使用下标重构原数组
print (u[indices])
#[5 2 6 2 7 5 6 8 2 9]
 
#返回去重元素的重复数量
u,indices = np.unique(a,return_counts = True)
print (u)
print (indices)
#[2 5 6 7 8 9]
#[3 2 2 1 1 1]

 参考:https://www.runoob.com/numpy/numpy-array-manipulation.html

以上,记录本人学习过程

你可能感兴趣的:(python,array)