专栏名称: CDA数据分析师
CDA数据分析师品牌官方微信,开放、创新、分享。
目录
相关文章推荐
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数组的属性

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

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 犯过的错误







请到「今天看啥」查看全文