多维数据的形象表示

import numpy as np
# 一维数据不用赘言
data_1d = np.array([0, 1, 2, 3])
# 二维数据作为 m 行 n 列的表格,例如 2 行 3 列
data_2d = np.arange(6).reshape(2, 3)
# 三维数据作为 k 层 m 行 n 列 的积木块, 例如 2 层 3 行 4 列
data_3d = np.arange(24).reshape(2, 3, 4)

检查一个 ndarray 数据的维度和大小,分别用 ndim 和 shape 属性。

>>> print(data_3d.ndim)
3
>>> print(data_3d.shape)
(2, 3, 4)

shape 是一个很关键的属性,我是这样把它和各个轴对应的:

shape: (2, 3, 4)
k, m, n
z, y, x

心法1: x, y, z 对应的shape元组是从右往左数的。

这是我的个人习惯,也符合主流的用法。

图像数据的小误会

打开一幅 640 x 480 的图像:

import numpy as np
import matplotlib.pylab as plt
image = plt.imread("lena.jpg")
print(image.shape)
# --- 结果 ---
# (480, 640, 3)
# (y, x, c)

不是 640 x 480 吗, 怎么倒过来了?我写代码的时候在这里总是犯迷糊。

在口头表达中,我们先说宽640,再说高480,而在计算机中是先高(y) 后宽(x),注意了!

每个像素有三个颜色分量(color),所以这个维度放在了最右边,可以理解,顺序就是 (y, x, c)

抽象轴上的操作

对于4维及更高维度的数据,无法在3维空间图示。这个时候,就不要考虑形象思维了,直接按照规则做处理。

用 shape 属性返回的元组,从左到右,座标轴分别命名为 axis 0, axis 1, ...,请注意,现在是从左向右数,正好是这个元组的 index,在以后的运算中,都按此规定。

>>> print(data.shape)
(3, 3, 2, 5)
# axis 0: 3
# axis 1: 3
# axis 2: 2
# axis 3: 5

心法2: 抽象座标轴顺序从左向右。指定哪个轴,就只在哪个轴向操作,其他轴不受影响。

排序(sorting)

data = np.array(np.arange(12))
np.random.shuffle(data)
data = data.reshape(3, 4)
print(data)
# [[10 8 3 2]
# [ 5 6 0 7]
# [11 4 9 1]]
print(np.sort(data, axis=0))
# [[ 5 4 0 1] | 小
# [10 6 3 2] | 到
# [11 8 9 7]] | 大
print(np.sort(data, axis=1))
# 小 到 大
# --------->
# [[ 2 3 8 10]
# [ 0 5 6 7]
# [ 1 4 9 11]]

如果你在心中能把抽象轴和 x, y, z 对应起来,则理解轴向排序很容易。

shape: (3, 4)
axis: 0, 1
AXIS: y, x

2. 求和、均值、方差、最大、最小、累加、累乘

这几个函数调用,一般会指定轴向,注意心法2

sum,mean,std,var,min,max 会导致这个轴被压扁,缩减为一个数值

data = np.arange(24).reshape(2, 3, 4)
print(data)
# [[[ 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( np.sum(data, axis=0) )
# 0轴被sum压扁,1轴2轴不变
# [[12 14 16 18]
# [20 22 24 26]
# [28 30 32 34]]
print( np.sum(data, axis=1) )
# 1轴被sum压扁,0轴2轴不变
# [[12 15 18 21]
# [48 51 54 57]]

cumsum,cumprod 不缩减轴向,只在指定轴向操作,请读者自己试验。

3. 索引和切片(indexing and slicing)

心法3: 在索引中出现冒号(:),则本轴继续存在,如果只是一个数值,则本轴消失。

例如,像 :, :1, 1: 这样的索引,保留此轴, data[:, :1, 2:] 中,三个轴都保留。 data[1, 4, 2] 三个轴都消失,只返回一个数值。

data[1:2, 0:1, 0:1] 中,三个轴都保留,但只有一个数据元素,很神奇吧。

data = np.arange(24).reshape(2, 3, 4)
print( data )
# [[[ 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( data[0, :, :] )
# axis 0,即 z 轴,是数值,则 z 轴消失,切了一片 x-y
# [[ 0 1 2 3]
# [ 4 5 6 7]
# [ 8 9 10 11]]
print( data[0, 1, 2] )
# 所有轴都消失,只返回一个标量数据
# 6
print( data[0:1, 1:2, 2:3] )
# 返回三维数据,虽然只有一个元素
# [[[6]]]

如何查看 ndarray 的维度呢?可以访问 shape 属性;如果打印出来了,那么就数一数起始的中括号个数,比如 [[[6]]], 有三个 [,那么就是三维数组。你记住了吗?

4. 拼接(concatenating)

同样遵循心法2,指定哪个轴,就在哪个轴向拼接:

data = np.arange(4).reshape(2, 2)
print( np.concatenate([data, data], axis=0) )
# 在轴向 0 拼接,即 y 方向
# [[0 1]
# [2 3]
# [0 1]
# [2 3]]
print( np.concatenate([data, data], axis=1) )
# 在轴向 1 拼接,即 x 方向
# [[0 1 0 1]
# [2 3 2 3]]

reshape 之迷乱

你有没有这个困惑:在 reshape 之后,数据在各个轴上是如何重新分配的?

搞清楚 ndarray 的数据在内存里的存放方式,以及各个维度的访问方式,reshape 困惑就迎刃而解了。

心法4: ndarray 的数据在内存里以一维线性存放,reshape 前后,数据没有变化,只是访问方式变了而已。

数据优先填充 X 轴向,其次 Y 轴,其次 Z 轴 。。。

有 C 语言基础的,很容易理解 ndarray 的实现,就是 C 中的多维数组而已。

int data[2][3][4];
int data[4][6];

总结

就说这么多,看了本文请亲自动手写代码体验一下。掌握此心法,可以纵横 numpy 世界而无大碍。

心法1: x, y, z 对应的shape元组是从右往左数的。

心法2: 抽象座标轴顺序从左向右。指定哪个轴,就只在哪个轴向操作,其他轴不受影响。

心法3: 在索引中出现冒号(:),则结果中本轴继续存在,如果只是一个数值,则本轴消失。

心法4: ndarray 的数据在内存里以一维线性存放,reshape 前后,数据没有变化,只是访问方式变了而已。

原文发布时间为:2018-09-20

本文作者:曲奇

本文来自云栖社区合作伙伴“磐创AI”,了解相关信息可以关注“磐创AI”。

基础 | numpy ndarray 之内功心法,理解高维操作!相关推荐

  1. Python基础——numpy.ndarray一维数组与多维数组

    shape为(3, 1)(表多维数组)与shape为(3, )(表一维数组)用法上有很大的不同 >>> x = np.random.randn(3) >>> x a ...

  2. Numpy基础(part2)--ndarray数组

    鄙人学习笔记,这个笔记以例子为主. 开发工具:Spyder 文章目录 ndarray数组对象的维度操作 视图变维(数据共享) 复制变维(数据独立) 就地变维 ndarray数组切片操作 多维数组的切片 ...

  3. 数据基础---numpy、pandas使用教程

    数组对象 Numpy库 Numpy最重要的一个特点是就是其N维数组对象,即ndarray,ndarray是一个通用的同构数据多维容器,其中的所有元素必须是相同类型的.每个数组都有一个shape(一个表 ...

  4. python3 多维数组 NumPy ndarray 简介

    目录 基础 重要属性 创建 Converting Python array_like Objects to NumPy Arrays 多维数组 一维 通用数学函数 基础 NumPy 的主要对象是齐次多 ...

  5. python数据分析 - numpy | ndarray数组 | numpy常用函数

    文章目录 数据分析 numpy概述 numpy历史 numpy的核心:多维数组 numpy基础 ndarray数组 内存中的ndarray对象 ndarray数组对象的特点 ndarray数组对象的创 ...

  6. Python基础----NumPy

    文章目录 NumPy - 简介 NumPy 操作 1.创建ndarray数组 1.1.基本的ndarray是使用 NumPy 中的数组函数创建 1.2.其他创建方法说明 1.3.numpy中的随机数生 ...

  7. python ndarray find_Python中Numpy ndarray的使用详解

    python: numpy的ndarray和array有什么区别?为什么小编以为小编够坚强了,可还是敌不过你的执着你的冷酷. What is the difference between ndarra ...

  8. Numpy入门教程:03.数组操作

    背景 什么是 NumPy 呢? NumPy 这个词来源于两个单词 – Numerical和Python.其是一个功能强大的 Python 库,可以帮助程序员轻松地进行数值计算,通常应用于以下场景: 执 ...

  9. 利用Python中的numpy.ndarray.reshape()对阵列形状进行调整

    我们在进行阵列运算的时候,常常要根据需要调整阵列的形状,numpy库中的函数reshape()可以方便地实现对阵列形状进行调整. 其函数原型如下: dst = numpy.ndarray.reshap ...

最新文章

  1. 【ACM】杭电OJ 1002
  2. 谁是AI行业最受关注的人?未来图灵发布《AI明星企业家热搜榜》
  3. elasticsearch v6.5.4配置
  4. word图片填充单元格
  5. Phonegap之内存问题
  6. 14项IgG样双特异性抗体工艺
  7. 动作基类 CCAction
  8. ocelot简单入门
  9. java 浏览器 爬虫_java 网络编程-爬虫+模拟浏览器
  10. veket linux软件下载6,veket linux官方
  11. linux下执行mysql的sql文件
  12. 关于 exynos 4412 按键中断 异步通知
  13. jQuery动画二级下拉菜单
  14. SM2258XT固态硬盘不认盘量产修复开卡工具,SM2258XT开卡教程
  15. Win7更换锁屏和开机画面
  16. 数学笔记11——微分和不定积分
  17. 复旦大学与国网上海共建“电力大数据实验室”
  18. 如何关闭任务栏中chrome浏览器的通知图标
  19. 人生中重要抉择:读研还是工作?
  20. Linux环境中安装zookeeper

热门文章

  1. ECharts 入门真的很简单
  2. 模拟电路--可编程数字稳压电源的设计
  3. 用单张2D图像重构3D场景
  4. 仿ios桌面vivo_vivo全新OriginOS细节曝光:系统UI大变样
  5. CodeForces 468 CHack it!
  6. layui table 时间戳
  7. 解决JAVA_HOME nor the JRE_HOME environment variable is defined
  8. 2017年3月20日下午学习日志
  9. AngularJS-liveRoomDirective.js 直播间指令
  10. [0002] Hadoop HDFS cmd常用命令练手