专栏名称: CDA数据分析师
CDA数据分析师品牌官方微信,开放、创新、分享。
目录
相关文章推荐
数据派THU  ·  【NeurIPS2024】用于缺失值数据集的 ... ·  4 天前  
软件定义世界(SDX)  ·  AI博士NeurIPS现场崩溃后悔读博,NY ... ·  4 天前  
软件定义世界(SDX)  ·  企业数字化顶层业务模型设计 ·  3 天前  
玉树芝兰  ·  想学好提示词写作吗?推荐给你一本好书 ·  4 天前  
51好读  ›  专栏  ›  CDA数据分析师

Python之numpy数组学习(三)

CDA数据分析师  · 公众号  · 大数据  · 2017-05-25 18:42

正文

作者  Airy
本文转自AiryData,转载需授权


前言

前面我们学习了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数组的属性

除了shapedtype属性外,ndarray类型的属性还很多。

ndim属性存储的是维度的数量。

size属性用来保存元素的数量。

itemsize属性可以返回数组中各个元素所占用的字节数。

nbytes属性存储整个数组所需的字节数量。这个属性的值正好是itemsizesize属性值的积。

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: '

b = np.arange(4).reshape(2,2)

print (b)
#Out: 
#array([[0, 1],
#       [2, 3]])

f = b.flat

print (f)
#Out:

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的数组拆分和其他属性。希望通过上面的操作能帮助大家。如果你有什么好的意见,建议,或者有不同的看法,我都希望你留言和我们进行交流、讨论。

推荐阅读


【书单】18本数据科学家必读的R语言和Python相关书籍

如何像数据科学家一样思考

北京VS上海,哪座城市人口更多?

我是如何一不小心阻止了勒索病毒的全球蔓延

用python抓取摩拜单车API数据并做可视化分析(源码)

2017年大数据和数据科学的六大发展趋势

你每天要花多少时间在手机上?

初级数据科学家求职时的 3 大必备能力

不可错过的优质深度学习课程

职场 | 数据库面试常问的一些基本概念

听说你最擅长“拖”,你“拖”得过Excel吗?

数据科学优质课程推荐#2:统计入门课程篇

歌手外科和猴姑,大数据告诉你白百何出轨后谁最惨

想学习数据科学?我们整理了一份优质编程入门课程清单

数据科学家在美国仍然是最热门工作的3大原因

一个优秀数据分析师的准则

Python 实现一个火车票查询的工具

干货 | 携程实时用户行为系统实践

数据分析证明最靠谱的电影评分网站不是 IMDB, 也不是烂番茄,而是...

那些年,写 Python 犯过的错误