预备阅读:Python之numpy数组学习(一)Python之numpy数组学习(二)
前言
前面我们学习了numpy库的简单应用和数组的处理,今天来学习下比较重要的如何拆分数组。
拆分numpy数组
数组可以从纵向、横向和深度方向来拆分数组,相关函数有hsplit()、vsplit()、sdplit()和split()。我们既可以把数组分成相同形状的数组,也可以从规定的位置开始切取数组(先介绍,代码在后)。
横向拆分:对于一个3×3数组,可以沿着横轴方向将其分解为3部分,并且各部分的大小和形状完全一致。
纵向拆分:vsplit()函数将沿着纵轴方向分解数组。当参数axis=0时,split()函数也会沿着纵轴方向分解数组。
深向拆分:dsplit()函数会沿着深度方向分解数组。
下面看一下代码(建议访问原文链接查看规范代码):
#-*- coding:utf-8 -*-
import numpy as np
a = np.arange(9).reshape(3, 3)
print (a)
#Out:
#array([[0, 1, 2],
# [3, 4, 5],
# [6, 7, 8]])
#横向拆分
print (np.hsplit(a, 3))
#Out:
#[array([[0],
# [3],
# [6]]),
# array([[1],
# [4],
# [7]]),
# array([[2],
# [5],
# [8]])]
print (np.split(a, 3, axis=1))
#Out:
#[array([[0],
# [3],
# [6]]),
# array([[1],
# [4],
# [7]]),
# array([[2],
# [5],
# [8]])]
#纵向拆分
print (np.vsplit(a, 3))
#Out: [array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])]
print (np.split(a, 3, axis=0))
#Out: [array([[0, 1, 2]]), array([[3, 4, 5]]), array([[6, 7, 8]])]
c = np.arange(27).reshape(3, 3, 3)
print (c)
#Out:
#array([[[ 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]]])
#深向拆分
print (np.dsplit(c, 3))
#Out:
#[array([[[ 0],
# [ 3],
# [ 6]],
#
# [[ 9],
# [12],
# [15]],
#
# [[18],
# [21],
# [24]]]),
# array([[[ 1],
# [ 4],
# [ 7]],
#
# [[10],
# [13],
# [16]],
#
# [[19],
# [22],
# [25]]]),
# array([[[ 2],
# [ 5],
# [ 8]],
#
# [[11],
# [14],
# [17]],
#
# [[20],
# [23],
# [26]]])]
Numpy数组的属性
除了shape和dtype属性外,ndarray类型的属性还很多。
ndim属性存储的是维度的数量。
size属性用来保存元素的数量。
itemsize属性可以返回数组中各个元素所占用的字节数。
nbytes属性存储整个数组所需的字节数量。这个属性的值正好是itemsize和size属性值的积。
T属性的作用和transpose()函数相同。
如果数组的秩(rank)小于2,那么所得只是一个数组的视图。
对于numpy来说,复数用j表示。
real属性将返回数组的实部,当数组元素全为实数时,就返回数组本身。
如果数组有复数,那么它的数据类型将自动变为复数类型。
flat属性可返回一个numpy.flatiter对象,这是获得flatiter对象的唯一方法。给flat属性赋值时,这个值会覆盖整个数组内所有的值,所以建议不要赋值。
下面用代码说明numpy数组的各种属性的详细用法。
#-*- coding:utf-8 -*-
import numpy as np
b = np.arange(24).reshape(2, 12)
print (b)
#Out:
#array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
# [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]])
print (b.ndim)
#Out: 2
print (b.size)
#Out: 24
print (b.itemsize)
#Out: 8
print (b.nbytes)
#Out: 192
print (b.size * b.itemsize)
#Out: 192
print (b.resize(6,4))
print (b)
#Out:
#array([[ 0, 1, 2, 3],
# [ 4, 5, 6, 7],
# [ 8, 9, 10, 11],
# [12, 13, 14, 15],
# [16, 17, 18, 19],
# [20, 21, 22, 23]])
print (b.T)
#Out:
#array([[ 0, 4, 8, 12, 16, 20],
# [ 1, 5, 9, 13, 17, 21],
# [ 2, 6, 10, 14, 18, 22],
# [ 3, 7, 11, 15, 19, 23]])
print (b.ndim)
#Out: 1
print (b.T)
#Out: array([0, 1, 2, 3, 4])
b = np.array([1.j + 1, 2.j + 3])
print (b)
#Out: array([ 1.+1.j, 3.+2.j])
print (b.real)
#Out: array([ 1., 3.])
print (b.imag)
#Out: array([ 1., 2.])
print (b.dtype)
#Out: dtype('complex128')
print (b.dtype.str)
#Out: '<c16'
b = np.arange(4).reshape(2,2)
print (b)
#Out:
#array([[0, 1],
# [2, 3]])
f = b.flat
print (f)
#Out: <numpy.flatiter object at 0x103013e00>
for it in f:
print (it)
#0
#1
#2
#3
print (b.flat[2])
#Out: 2
print (b.flat[[1,3]])
#Out: array([1, 3])
print (b)
#Out:
#array([[7, 7],
# [7, 7]])
b.flat[[1,3]] = 1
print (b)
#Out:
#array([[7, 1],
# [7, 1]])
数组的转换
我们可以把numpy数组转换成Python列表,使用tolist()函数。
astype()函数可以把数组元素转换成指定类型。
PS.当complex类型转换成int类型时,虚部将被丢弃,另外,还需要将数据类型的名称以字符串的形式传递给astype()函数。
下面看一下代码:
#-*- coding:utf-8 -*-
import numpy as np
b = np.array([ 1.+1.j, 3.+2.j])
print (b)
#Out: array([ 1.+1.j, 3.+2.j])
print (b.tolist())
#Out: [(1+1j), (3+2j)]
print (b.tostring())
#Out: b'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x08@\x00\x00\x00\x00\x00\x00\x00@'
print (np.fromstring(b'\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\xf0?\x00\x00\x00\x00\x00\x00\x08@\x00\x00\x00\x00\x00\x00\x00@', dtype=complex))
#Out: [ 1.+1.j, 3.+2.j]
print (np.fromstring('20:42:52',sep=':', dtype=int))
#Out: [20, 42, 52]
print (b)
#Out: [ 1.+1.j, 3.+2.j]
print (b.astype(int))
#d:/Anaconda3/Scripts/ipython-script.py:1: ComplexWarning: Casting complex values to real discards the imaginary part
# if __name__ == '__main__':
#Out: [1 3]
print (b.astype('complex'))
#Out: [ 1.+1.j, 3.+2.j]
小结
今天学习一下Python中numpy的数组拆分和其他属性。希望通过上面的操作能帮助大家。如果你有什么好的意见,建议,或者有不同的看法,我都希望你留言和我们进行交流、讨论。
欢迎关注微信公众号,访问更多精彩:AiryData。
如需转载,请联系授权,谢谢合作。