Python之numpy数组学习(三)

浏览: 1438

预备阅读: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

如需转载,请联系授权,谢谢合作。

推荐 0
本文由 Airy 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册