转自:http://blog.sciencenet.cn/home.php?mod=space&uid=3031432&do=blog&id=1064033

1. NumPy中的N维数组ndarray基本介绍

- NumPy中基本的数据结构

- 所有元素是同一种类型

- 别名array(数组)

- 节省内存,提高CPU计算时间

- 有丰富的函数

注:NumPy的思维模式是面向数组

2.ndarray数组属性

- 下标从0开始。

- 一个ndarray数组中的所有元素的类型必须相同。

- 轴(axis):每一个线性的数组称为是一个轴,也就是维度(dimensions)。比如,二维数组相当于是两个一维数组,其中第一个一维数组中每个元素又是一个一维数组,所以一维数组就是ndarray中的轴,第一个轴(也就是第0轴)相当于是底层数组,第二个轴(也就是第1轴)是底层数组里的数组

很多时候可以声明axis。axis=0,表示沿着第0轴进行操作,即对每一列进行操作;axis=1,表示沿着第1轴进行操作,即对每一行进行操作。

- 秩(rank):维数,一维数组的秩为1,二维数组的秩为2,以此类推。即轴的个数。

- 基本属性

ndarray1.ndim - 秩

ndarray1.shape - 维度 # 是一个元组,表示数组在每个维度上的大小。比如,一个二维数组,其维度表示“行数”和“列数”。该元组的长度即为秩

ndarray1.size - 元素总个数 # 等于shape属性中元组元素的乘积。

ndarray1.dtype - 元素类型

ndarray1.itemsize - 元素字节大小 # 即元素所占内存空间大小,例如,元素类型为float64的数组的itemsiz属性值为8(=64/8),元素类型为complex32的数组的itemsize属性为4(=32/8)。

ndarray1.data - 包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用这个属性。

例如:以下5x5的数组,可以看成由5个一维数组构成,每个一维数组包含5个元素;第一维被称为第0轴(列),第二维被称为第1轴(行);秩为2,维度为(5,5),元素总个数为25。

3.如何创建ndarray

3.1从已有数据-——从list、tuple

array() - 创建多维数组。

np.array(object, dtype=None, copy=True, order='K', subok=False, ndmin=0)

object — list或tuple对象。强制参数。

dtype — 数据类型。可选参数。

copy — 默认为True,对象被复制。可选参数。

order — 数组按一定的顺序排列。C - 按行;F - 按列;A - 如果输入为F则按列排列,否则按行排列;K - 保留按行和列排列。默认值为K。可选参数。

subok — 默认为False,返回的数组被强制为基类数组。如果为True,则返回子类。可选参数。

ndmin — 最小维数。可选参数。

注:array函数的参数必须是由方括号括起来的列表,而不能使用多个数值作为参数调用array。

>>> import numpy as np
>>> arr1=np.array([[1,2,3],[4.1,5.1,6.1]])
>>> arr1
array([[1. , 2. , 3. ],
[4.1, 5.1, 6.1]])
>>> arr2=np.array([(1,2,3),(4.1,5.1,6.1)])
>>> arr2
array([[1. , 2. , 3. ],
[4.1, 5.1, 6.1]])

//上述代码中1是由元祖创建,2是由列表创建。

3.2从字符串中读取 - fromstring()

fromstring() - 从字符串中读取数据,并将其转换为一维数组。

np.fromstring(string, dtype=float, count=-1, sep='')

string — 包含数据的字符串。强制参数。

dtype — 数据类型,默认为浮点型。可选参数。

count — 从左到右读取数据的个数。默认为-1,表示读取所有数据。可选参数。

sep — 分隔符。若不指定分隔符,或指定为空,则字符串包含的数据被解译为二进制数据,否则为带有小数的ASCII文本。可选参数。

>>> arr1=np.fromstring('1,2,3,4',dtype=int,sep=',')
>>> arr1
array([1, 2, 3, 4])
>>> arr2=np.fromstring('1 2 3 4',dtype=int,sep=' ')
>>> arr2
array([1, 2, 3, 4])

3.3从可迭代对象中读取 - fromiter()

fromiter() - 从可迭代对象中读取数据,并将其转换为一维数组。

np.fromiter(iterable, dtype, count=-1)

iterable — 可迭代对象。不能有嵌套。强制参数。

dtype — 数据类型。强制参数。

count — 表示从可迭代对象中读取的项目数。默认为-1,表示读取所有数据。可选参数。

>>> it=(x*x for x in range(5))
>>> it
<generator object <genexpr> at 0x000001B85AB17BA0>

>>> x*x for x in range(5)
SyntaxError: invalid syntax
>>> np.fromiter(it,float)
array([ 0., 1., 4., 9., 16.])
>>> np.fromiter('',int)
array([1, 2, 3, 4])
>>> np.fromiter('1,2,3,4',int)#这样对于int是不可迭代的
Traceback (most recent call last):
File "<pyshell#14>", line 1, in <module>
np.fromiter('1,2,3,4',int)
ValueError: invalid literal for int() with base 10: ',' >>> np.fromiter((1,2,3,4),float)
array([1., 2., 3., 4.])

3.4以函数式创建 - fromfunction()

fromfunction() - 在每个坐标轴上执行函数表达式,用得到的数据创建数组。

np.fromfunction(function, shape, dtype)

function — 可调用的函数。必选参数。

shape — 要创建的数组的维度。其长度与函数参数的个数一致。必选参数。

dtype — 数据类型,默认为浮点型。可选参数

//这里的x y,我是真的不太理解。为什么就得到这个了?

>>> np.fromfunction(f,(3,3))
(array([[0., 0., 0.],
[1., 1., 1.],
[2., 2., 2.]]), array([[0., 1., 2.],
[0., 1., 2.],
[0., 1., 2.]]))

3.5创建全1数组—— ones(), ones_like()

ones() - 创建给定形状的ndarray,并将数组中所有元素填充为1。

np.ones(shape, dtype=None, order='C')

shape — 维度。强制参数。

dtype — 数据类型。默认为np.float64。可选参数。

order — 数组按一定的顺序排列。C - 按行;F - 按列。默认值为C。可选参数。

ones_like() -  创建与参数数组形状和类型相同的ndarray,并将数组中所有元素填充为1。

np.ones_like(a, dtype=None, order='K', subok=True)

a — 给定的数组。其维度和数据类型决定着要创建的数组的属性。强制参数。

dtype — 数据类型。默认的“None”意为“a.dtype”。可选参数。

order — 数组按一定的顺序排列。C - 按行;F - 按列;A - 如果输入为F则按列排列,否则按行排列;K - 保留按行和列排列。默认值为K。可选参数。

subok — 默认为True,返回的数组被强制为子类数组。如果为False,则返回基类数组。可选参数。

>>> x=np.ones((5))
>>> x.ndim
1
>>> x.shape
(5,)
>>> np.ones((5,2),int)#参数shape
array([[1, 1],
[1, 1],
[1, 1],
[1, 1],
[1, 1]])
>>> a=np.array([[1,2,3],[4,5,6]])
>>> np.ones_like(a)
array([[1, 1, 1],
[1, 1, 1]])
>>> np.ones((5,))#这两个都是创建一维的数组
array([1., 1., 1., 1., 1.])
>>> np.ones((5))#这两个都是创建一维的数组
array([1., 1., 1., 1., 1.])

3.6创建‘全0’数组 - zeros(), zeros_like()

zeros() - 创建给定形状的ndarray,并将数组中所有元素填充为0。

np.zeros(shape, dtype=float, order='C')

shape — 维度。强制参数。

dtype — 数据类型。默认为np.float64。可选参数。

order — 数组按一定的顺序排列。C - 按行;F - 按列。默认值为C。可选参数。

zeros_like() -  创建与参数数组形状和类型相同的ndarray,并将数组中所有元素填充为0。

np.zeros_like(a, dtype=None, order='K', subok=True)

a — 给定的数组。其维度和数据类型决定着要创建的数组的属性。强制参数。

dtype — 数据类型。默认的“None”意为“a.dtype”。可选参数。

order — 数组按一定的顺序排列。C - 按行;F - 按列;A - 如果输入为F则按列排列,否则按行排列;K - 保留按行和列排列。默认值为K。可选参数。

subok — 默认为True,返回的数组被强制为子类数组。如果为False,则返回基类数组。可选参数。

>>> np.zeros((5,2))
array([[0., 0.],
[0., 0.],
[0., 0.],
[0., 0.],
[0., 0.]])
>>> np.zeros_like(a)
array([[0, 0, 0],
[0, 0, 0]])
#与创建全1数组相似

3.7创建空数组 - empty(), empty_like()

empty() - 返回一个没有初始化内存的数组,该数组是空的。

np.empty(shape, dtype=float, order='C')

shape — 维度。强制参数。

dtype — 数据类型。默认为np.float64。可选参数。

order — 数组按一定的顺序排列。C - 按行;F - 按列。默认值为C。可选参数。

empty_like() - 返回一个与给定数组的维度和数据类型相同的新数组。

np.empty_like(a, dtype=None, order='K', subok=True)

a — 给定的数组。其维度和数据类型决定着要创建的数组的属性。强制参数。

dtype — 数据类型。默认的“None”意为“a.dtype”。可选参数。

order — 数组按一定的顺序排列。C - 按行;F - 按列;A - 如果输入为F则按列排列,否则按行排列;K - 保留按行和列排列。默认值为K。可选参数。

subok — 默认为True,返回的数组被强制为子类数组。如果为False,则返回基类数组。可选参数。

>>> np.zeros((5,2))#创建0数组
array([[0., 0.],
[0., 0.],
[0., 0.],
[0., 0.],
[0., 0.]])
>>> np.zeros_like(a)
array([[0, 0, 0],
[0, 0, 0]])
>>> np.full((2,3),4)#用数据填充
array([[4, 4, 4],
[4, 4, 4]])
>>> np.full_like(a,2)
array([[2, 2, 2],
[2, 2, 2]])
>>> np.empty((2,2))
array([[6.01347002e-154, 4.02456140e-066],
[5.56435215e+141, 4.48505083e-308]])
>>> np.empty((2,2),int)#创建空数组,不会申请空间
array([[0, 0],
[0, 0]])
>>> np.eye((2,3))#eye创建对角矩阵,它与其他的参数是不一样的,参数分别是 行,列。
Traceback (most recent call last):
File "<pyshell#32>", line 1, in <module>
np.eye((2,3))
File "C:\Users\85937\AppData\Local\Programs\Python\Python36\lib\site-packages\numpy\lib\twodim_base.py", line 186, in eye
m = zeros((N, M), dtype=dtype, order=order)
TypeError: 'tuple' object cannot be interpreted as an integer
>>> np.eye((2,3) SyntaxError: invalid character in identifier
>>> np.eye(2,3) array([[1., 0., 0.],
[0., 1., 0.]])
>>> np.identity(3)#创建单位矩阵,只有一个整型,创建的是方阵。 array([[1., 0., 0.],
[0., 1., 0.],
[0., 0., 1.]])
>>>

4.改变数组形状

reshape() - 改变数组的形状。通过reshape生成的新数组和原始数组共用一个内存,也就是说,若更改其中数组的元素,另一个数组也将发生改变。

reshape(a, newshape, order='C')

ndarray1.reshape(newshape)

>>> a.reshape(3,2)#即当前数组的reshape函数

array([[1, 2],
[3, 4],
[5, 6]])
>>> a.reshape(3,2,order='F')#参数改为F,按列。不太明白这个是如何搞的 array([[1, 5],
[4, 3],
[2, 6]])
>>> a array([[1, 2, 3],
[4, 5, 6]])
>>> b=a.reshape(3,2) >>> b array([[1, 2],
[3, 4],
[5, 6]])
>>> b[2,1]=0#修改变形之后的b中的元素值,同样会改变a,两者共用的是一个存储空间 >>> a array([[1, 2, 3],
[4, 5, 0]])
>>> b array([[1, 2],
[3, 4],
[5, 0]])
>>> np.reshape(a,2,3) array([[1, 2, 3],
[4, 5, 0]])
>>> b=np.reshape(a,(2,3)) >>> b array([[1, 2, 3],
[4, 5, 0]])
>>> b=np.reshape(a,(3,2)) >>> b array([[1, 2],
[3, 4],
[5, 0]])
>>> b[2,1]=6#np.reshape效果也是一样的。 >>> b array([[1, 2],
[3, 4],
[5, 6]])
>>> a array([[1, 2, 3],
[4, 5, 6]])

5创建等差数列数组

arange() - 创建一个一维的等差数列数组,与Python中的range()函数类似。区别在于,np.arange()返回的是一个numpy数组,而Python中的range()函数返回的是一个列表。

np.arange(start, stop, step步长, dtype=None)//这里的stop是取不到的

linspace() - 创建一个一维数组,在给定的区间上num等分

np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

stop — 区间终止值(是否取得到,需要设定参数endpoint)。强制参数。

>>> np.arange(3)

array([0, 1, 2])#取不到3
>>> range(3) range(0, 3)#是一个list
>>> np.arange(1,5,2) >>> np.arange(1,3.1,2) array([1., 3.])
>>> np.linspace(1,5,2) array([1., 5.])
>>> np.linspace(1,5,5) array([1., 2., 3., 4., 5.])

6.数据切片与索引

一维数组

二维数组

//以切片方式索引,与 索引。

以数组索引:

第6行中的意思是A的[0,1]和[2,3]元素是什么?

第8行的意思是B中的[0,0]和[1,1]元素是什么?

也就是说前后两个数组长度一样,是两两对应的。

布尔型索引

神奇的布尔索引。

>>> B=np.arange(10).reshape(2,5)

>>> B

array([[0, 1, 2, 3, 4],
[5, 6, 7, 8, 9]])
>>> for row in B.T:
print(row) [0 5]
[1 6]
[2 7]
[3 8]
[4 9]
>>> for col in B.T:
print(col) [0 5]
[1 6]
[2 7]
[3 8]
[4 9]
>>> B.T array([[0, 5],
[1, 6],
[2, 7],
[3, 8],
[4, 9]])

//这里对B的转置中,遍历行和遍历列都是一样的结果。

列出B中的元素:

转化为一维数组之后打印。B并未改变

最值索引

in5行中,参数1表示按行,in7中有0,表示按列索引。

注意返回的不是最值,而是最值的索引即下标。

7.ndarray的运算

加减乘除、点乘、乘方、整余数

以上的运算,在np中有相应的函数。

点乘就是矩阵乘法。

Py中的多维数组ndarray学习【转载】的更多相关文章

  1. 一些Python中的二维数组的操作方法

    一些Python中的二维数组的操作方法 这篇文章主要介绍了一些Python中的二维数组的操作方法,是Python学习当中的基础知识,需要的朋友可以参考下 需要在程序中使用二维数组,网上找到一种这样的用 ...

  2. C#中读取二维数组每位的长度

    C#中的二维数组,如int[,] A=new int[a,b];则 a=A.GetLength(0);即可获得二维数组中第一维的长度. b=A.GetLength(1);即可获得二维数组中第二维的长度 ...

  3. Java中的二维数组

    Java 中的二维数组 所谓二维数组,可以简单的理解为是一种"特殊"的一维数组,它的每个数组空间中保存的是一个一维数组. 那么如何使用二维数组呢,步骤如下: 1. 声明数组并分配空 ...

  4. iOS中的二维数组

    首先我们知道OC中是没有二维数组的,二维数组是通过一位数组的嵌套实现的,但是别忘了我们有字面量,实际上可以和C/C++类似的简洁地创建和使用二维数组.这里总结了创建二维数组的两种方法以及数组的访问方式 ...

  5. 如何在C中传递二维数组作为参数?

    回答: 在C语言中,有很多方法可以将2d数组作为参数传递.在下面的部分中,我描述了将2d数组作为参数传递给函数的几种方法. 使用指针传递2d数组以在c中运行 多维数组的第一个元素是另一个数组,所以在这 ...

  6. 深度学习网络中numpy多维数组的说明

    目前在计算机视觉中应用的数组维度最多有四维,可以表示为 (Batch_size, Row, Column, Channel) 以下将要从二维数组到四维数组进行代码的简单说明: Tips: 1) 在nu ...

  7. 在python中定义二维数组

    发表于 http://liamchzh.0fees.net/?p=234&i=1 一次偶然的机会,发现python中list非常有意思. 先看一段代码 [py]array = [0, 0, 0 ...

  8. php中遍历二维数组并以表格的形式输出

    一.索引数组 <?php //使用array()语句结构将联系人列表中所有数据声明为一个二维数组,默认下标是顺序数字索引 $contact1 = array( //定义外层数组 array(1, ...

  9. Java 中的二维数组

    所谓二维数组,可以简单的理解为是一种“特殊”的一维数组,它的每个数组空间中保存的是一个一维数组. 那么如何使用二维数组呢,步骤如下: 1. 声明数组并分配空间 或者 如: 2. 赋值 二维数组的赋值, ...

随机推荐

  1. 【Python】协程

    协程,又称微线程,纤程.英文名Coroutine. 协程的概念很早就提出来了,但直到最近几年才在某些语言(如Lua)中得到广泛应用. 子程序,或者称为函数,在所有语言中都是层级调用,比如A调用B,B在 ...

  2. java基础---->git的使用(一)

    这里面记录一下git的使用,只是平时工作中遇到的一些问题的解决方案,不会涉及到git的一些基础概念及说明.人的天性便是这般凉薄,只要拿更好的来换,一定舍得. Git的一些使用 一.在码云建立好仓库之后 ...

  3. 一劳永逸的搞定 FLEX 布局(转)

    一劳永逸的搞定 flex 布局 寻根溯源话布局 一切都始于这样一个问题:怎样通过 CSS 简单而优雅的实现水平.垂直同时居中.记得刚开始学习 CSS 的时候,看到 float 属性不由得感觉眼前一亮, ...

  4. sencha touch 在线实战培训 第一期 第四节

    2014.1.4晚上8点开的课 第一节收费课程,还是有几位同学付费了,这些课程也录像了的,以后也会持续销售. 本期培训一共八节,前三堂免费,后面的课程需要付费才可以观看. 本节内容:          ...

  5. Dumb Bones UVA - 10529[多米诺重构]

    Dumb Bones UVA - 10529   来自绿书p176  题意 你试图把一些多米诺骨牌排成直线,然后推倒它们.但是如果你在放骨牌的时候不小心把刚放的骨牌碰倒了,它就会把相临的一串骨牌全都碰 ...

  6. Unity3D笔记 GUI 四、实现选项卡三

    一.代码: using UnityEngine; using System.Collections; /// <summary> /// 选项卡二 /// </summary> ...

  7. 静态类(static)与java值传递、引用传递小测

    java中都是值传递.直接上代码了: class TestStaticA { static { System.out.println("b"); } public TestStat ...

  8. flask BytesIO() 多个文件打包下载 zipfile

    使用zipfile模块可以将多个文件打包成zip文件进行下载,但是常规的操作方式会在服务器磁盘上生成一个zip文件占用磁盘空间. 后引入BytesIO将文件写入到内存中然后下载: def dl_pla ...

  9. 7.20 python线程3

    2018-7-20 18:46:49 去俺弟家玩去 后天回来 1.复习 # !/usr/bin/env python # !--*--coding:utf-8 --*-- # !@Time :2018 ...

  10. Java中为什么需要反射?反射要解决什么问题?

    一句话概括就是使用反射可以赋予jvm动态编译的能力,否则类的元数据信息只能用静态编译的方式实现,例如热加载,Tomcat的classloader等等都没法支持 Java中编译类型有两种: 静态编译:在 ...