数组重塑
reshape重塑数组
-1自动推导维度大小
# -*- coding: utf-8 -*-
import numpy as np
print("将一维数组转换为二维数组")
arr = np.arange(8)
print(arr.reshape((4, 2)))
print(arr.reshape((4, 2)).reshape((2, 4))) # 支持链式操作
print
print("维度大小自动推导")
arr = np.arange(15)
print(arr.reshape((5, -1)))
print
print("获取维度信息并应用")
other_arr = np.ones((3, 5))
print(other_arr.shape)
print(arr.reshape(other_arr.shape))
print()
print("高维数组拉平")
arr = np.arange(15).reshape((5, 3))
print(arr.ravel())
将一维数组转换为二维数组
[[0 1]
[2 3]
[4 5]
[6 7]]
[[0 1 2 3]
[4 5 6 7]]
维度大小自动推导
[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]
[ 9 10 11]
[12 13 14]]
获取维度信息并应用
(3, 5)
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]]
高维数组拉平
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14]
高级应用 数组的合并和拆分
数组连接函数
类型 | 说明 |
---|
concatenate | 最一般化的连接,沿一条轴连接一组数组 |
vstack, row_stack | 以面向行的方式对数组进行堆叠(沿轴0) |
hstack, | 以面向行的方式对数组进行堆叠(沿轴1) |
column_stack | 类似于hstack,但是会先将一维数组转换为二维列向量。 |
dstack | 以面向“深度”的方式对数组进行堆叠(沿轴2) |
split | 沿指定轴在指定的位置拆分数组 |
hsplit, vsplit, dsplit | split的便捷化函数,分别沿着轴0、轴1和轴2进行拆分。 |
• _r对象
• _c对象
# -*- coding: utf-8 -*-
import numpy as np
import numpy.random as np_random
print('连接两个二维数组')
arr1 = np.array([[1, 2, 3], [4, 5, 6]])
arr2 = np.array([[7, 8, 9], [10, 11, 12]])
arr3 = np.array([[13, 14, 15], [16, 17, 18]])
print(np.concatenate([arr1, arr2], axis = 0)) # 按行连接
print(np.concatenate([arr1, arr2], axis = 1)) # 按列连接
print(np.concatenate([arr1, arr2, arr3], axis = 1)) # 按列连接
print()
# 所谓堆叠,参考叠盘子。。。连接的另一种表述
print('垂直stack与水平stack')
print(np.vstack((arr1, arr2))) # 垂直堆叠
print(np.hstack((arr1, arr2))) # 水平堆叠
print(np.hstack((arr1, arr2, arr3))) # 水平堆叠
print()
print('拆分数组')
arr = np_random.randint(0, 9,size=(5,5))
print(arr)
print('水平拆分')
# numpy.split(),用于拆分数组
# arr,需要进行拆分的数组
# [x,y,z,...],按数组进行拆分,x等表示要拆分的行(列),如拆分成[0,...,x-1],[x,...,y-1],[...]组成的多个子数组
# axis = n,表示按轴n进行拆分。
first, second, third = np.split(arr, [1, 3], axis = 0)
print('first')
print(first)
print('second')
print(second)
print('third')
print(third)
print('垂直拆分')
first, second, third = np.split(arr, [1, 3], axis = 1)
print('first')
print(first)
print('second')
print(second)
print('third')
print(third)
print()
# 堆叠辅助类
arr = np.arange(6)
arr1 = arr.reshape((3, 2))
print(arr1)
arr2 = np_random.randint(6,size=(3, 2))
print(arr2)
print('r_用于按行堆叠')
print(np.r_[arr1, arr2])
print('c_用于按列堆叠')
print(np.c_[np.r_[arr1, arr2], arr])
print('切片直接转为数组')
print(np.c_[1:6, -10:-5])
连接两个二维数组
[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]]
[[ 1 2 3 7 8 9]
[ 4 5 6 10 11 12]]
[[ 1 2 3 7 8 9 13 14 15]
[ 4 5 6 10 11 12 16 17 18]]
垂直stack与水平stack
[[ 1 2 3]
[ 4 5 6]
[ 7 8 9]
[10 11 12]]
[[ 1 2 3 7 8 9]
[ 4 5 6 10 11 12]]
[[ 1 2 3 7 8 9 13 14 15]
[ 4 5 6 10 11 12 16 17 18]]
拆分数组
[[7 4 7 5 2]
[5 2 1 7 1]
[7 5 2 5 0]
[3 7 1 3 5]
[8 8 2 0 7]]
水平拆分
first
[[7 4 7 5 2]]
second
[[5 2 1 7 1]
[7 5 2 5 0]]
third
[[3 7 1 3 5]
[8 8 2 0 7]]
垂直拆分
first
[[7]
[5]
[7]
[3]
[8]]
second
[[4 7]
[2 1]
[5 2]
[7 1]
[8 2]]
third
[[5 2]
[7 1]
[5 0]
[3 5]
[0 7]]
[[0 1]
[2 3]
[4 5]]
[[5 1]
[1 3]
[3 1]]
r_用于按行堆叠
[[0 1]
[2 3]
[4 5]
[5 1]
[1 3]
[3 1]]
c_用于按列堆叠
[[0 1 0]
[2 3 1]
[4 5 2]
[5 1 3]
[1 3 4]
[3 1 5]]
切片直接转为数组
[[ 1 -10]
[ 2 -9]
[ 3 -8]
[ 4 -7]
[ 5 -6]]
元素的重复操作
• _tile 对数组进行操作,复制整个数组元素。
• _repeat 对元素进行操作,复制元素。
# -*- coding: utf-8 -*-
import numpy as np
import numpy.random as np_random
# numpy.repeat() 可以按行(列)复制元素
print('Repeat: 按元素')
arr = np.arange(3)
print(arr.repeat(3))
print(arr.repeat([2, 3, 4])) # 3个元素,分别复制2, 3, 4次。长度要匹配!
print()
print('Repeat,指定轴')
arr = np_random.randint(10,size=(2, 2))
print(arr)
print(arr.repeat(2, axis = 0)) # 按行repeat
print(arr.repeat(2, axis = 1)) # 按列repeat
print()
# numpy.title() 完整复制数组,形成新数组,类似把数组当成一块瓷砖,复制瓷砖。
print('Tile: 参考贴瓷砖')
print(np.tile(arr, 2))
print(np.tile(arr, (2, 3))) # 指定每个轴的tile次数
Repeat: 按元素
[0 0 0 1 1 1 2 2 2]
[0 0 1 1 1 2 2 2 2]
Repeat,指定轴
[[4 8]
[6 0]]
[[4 8]
[4 8]
[6 0]
[6 0]]
[[4 4 8 8]
[6 6 0 0]]
[[4 8]
[4 8]
[6 0]
[6 0]]
Tile: 参考贴瓷砖
[[4 8 4 8]
[6 0 6 0]]
[[4 8 4 8 4 8]
[6 0 6 0 6 0]
[4 8 4 8 4 8]
[6 0 6 0 6 0]]
花式索引的等价函数
• take 取出数组中索引的值所组成的新数组
• put 更新或替换数组对应索引位置的元素值。
# -*- coding: utf-8 -*-
import numpy as np
import numpy.random as np_random
print('Fancy Indexing例子代码')
arr = np.arange(10)
inds = [7, 1, 2, 6]
print(arr[inds])
# 花式索引栗子
# 即把数组arr的第inds个索引值即arr[7],arr[1],arr[2],arr[6]所组成的数组打印出来。
print()
# numpy.take(arr,inds)等同于花式索引方法。也是取出索引inds值的数组。
print('使用take')
print(arr.take(inds))
print()
# numpy.put()类似使用花式索引更新数组元素。
print('使用put更新内容')
# 将arr数组中的inds位置元素全部替换为元素值5。
arr.put(inds, 5)
print(arr)
# inds = [7, 1, 2, 6]
# 这里需要注意inds和[11, 12, 13, 14]必须是同型的。
arr.put(inds, [11, 12, 13, 14])
print(arr)
print()
print('take,指定轴')
arr = np_random.randint(10,size=(2, 4))
inds = [2, 0, 2, 1]
print(arr)
print(arr.take(inds, axis = 1)) # 按列take
Fancy Indexing例子代码
[7 1 2 6]
使用take
[7 1 2 6]
使用put更新内容
[0 5 5 3 4 5 5 5 8 9]
[ 0 12 13 3 4 5 14 11 8 9]
take,指定轴
[[8 8 0 5]
[4 7 5 1]]
[[0 8 0 8]
[5 4 5 7]]