Numpy基础(part2)--ndarray数组

鄙人学习笔记,这个笔记以例子为主。
开发工具:Spyder



ndarray数组对象的维度操作

视图变维(数据共享)

举例:若a与b共用同一个数据,若把b改了,则a也变了。
相关函数:reshape() 与 ravel()

  • 例子1

代码:

import numpy as np
a = np.arange(1, 9)
print('a:', a)		# [1 2 3 4 5 6 7 8]
b = a.reshape(2, 4)	#视图变维  : 变为2行4列的二维数组
print('b:',b)
c = b.reshape(2, 2, 2) #视图变维    变为2页2行2列的三维数组
print('c:',c)
d = c.ravel()	#视图变维	变为1维数组
print('d:',d)

结果:

  • 例子2

代码1:

import numpy as np
a = np.arange(1, 10)
print(a, a.shape)
b = a.reshape(3, 3)
print(b, b.shape)
b[0, 0] = 98
print(a, a.shape)

结果1:

代码2:

import numpy as np
a = np.arange(1, 10)
b = a.reshape(3, 3)
b[0, 0] = 98
c = b.ravel()
print('c:', c, c.shape)
print('a:', a, a.shape)

结果2:

复制变维(数据独立)

举例:通过a得到一个b,虽然数据内容是一样的,但却是两份数据,他们的地址不同。
相关函数:flatten()

  • 例子

代码:

import numpy as np
a = np.arange(1, 10)
b = a.reshape(3, 3)
b[0, 0] = 98
c = b.flatten()
c[2] = 53
print('c:', c, c.shape)
print('b:', b, b.shape)
print('a:', a, a.shape)

结果:

就地变维

含义:直接改变原数组对象的维度,不返回新数组。
相关函数:shape()与resize()

  • 例子

代码:

import numpy as np
a = np.arange(1, 9)
print('a:', a)
a.shape = (2, 4)
print("a", a)
a.resize(2, 2, 2)
print('a:', a)

结果:

ndarray数组切片操作

  • 语法
数组对象[起始位置:终止位置:步长]
  • 说明

①默认位置步长为1;步长为+时,默认切从首到尾;步长为-时,默认切从尾到首。
②数组对象切片的参数设置与列表切面参数类似

  • 例子(还需继续研究)

备注:若为若为[:]或[ : : ]则为复制。

多维数组的切片操作

  • 例子1

代码:

import numpy as np
a = np.arange(1, 28)
a.resize(3,3,3)
print('a:', a, '\n')
print('切出第1页:', a[0, :, :], '\n')		
print('切出所有页的第2行:', a[:, 1, :], '\n')		
print('切出第1页的第3列:',a[0, :, 2])

结果:

  • 例子2

代码:

import numpy as np
a = np.arange(1, 28)
a.resize(3,3,3)

print(a[:, :2, :], '\n')
print('--------------')
print(a[:2, :2, :2])

结果:

ndarray数组的掩码操作

掩码是啥?看下面这段代码:

被蓝色矩形框起来的就是掩码。

  • 例子1

代码:

import numpy as np
a = np.arange(1, 20)

mask = [a % 3 == 0]
print(mask)
print(a[mask])

结果:

  • 例子2

代码:

import numpy as np
a = np.arange(1, 50)

mask = [(a % 3 == 0) & (a % 5 == 0)]
print(mask)
print(a[mask])

结果:

  • 例子3(使用掩码把数组中的元素重新排列)

代码:

import numpy as np
a = np.array(['a', 'b', 'c', 'd', 'e'])

mask = [2, 4, 1, 0, 2, 3, 1]
print(a[mask])

结果:

多维数组的组合和拆分

垂直方向操作

相关函数:vstack()与vsplit()

  • 例子

代码:

import numpy as np
a = np.arange(1, 7).reshape(2, 3)
b = np.arange(7, 13).reshape(2, 3)
# 垂直方向完成组合操作,生成新数组
c = np.vstack((a, b))
print('c:', c)
# 垂直方向完成拆分操作,生成两个数组
d, e = np.vsplit(c, 2)
print('d:', d)
print('e:', e)

结果:

垂直方向拆分是分成上下两份。

水平方向操作

相关函数:hstack()与hsplit()

  • 例子

代码:

import numpy as np
a = np.arange(1, 7).reshape(2, 3)
b = np.arange(7, 13).reshape(2, 3)
# 水平方向完成组合操作,生成新数组 
c = np.hstack((a, b))
print('c:', c)
# 水平方向完成拆分操作,生成两个数组
d, e = np.hsplit(c, 2)
print('d:', d)
print('e:', e)

结果:

水平方向拆分是分成左右两块。

深度方向操作(3维)

相关函数:dstack()与dsplit()

  • 例子

代码:

import numpy as np
a = np.arange(1, 7).reshape(2, 3)
b = np.arange(7, 13).reshape(2, 3)
# 深度方向(3维)完成组合操作,生成新数组
c = np.dstack((a, b))
# 深度方向(3维)完成拆分操作,生成两个数组
d, e = np.dsplit(c, 2)
print('c:', c)
print('d:', d)
print('e:', e)

结果:

长度不等的数组组合

相关函数:pad()

  • 例子

代码:

import numpy as np
a = np.array([1,2,3,4,5])
b = np.array([1,2,3,4])
# 填充b数组使其长度与a相同
# 前补0个元素,后补1个元素,都补上-1
b = np.pad(b, pad_width=(0, 1), mode='constant', constant_values=-1)
print('b:', b)
# 垂直方向完成组合操作,生成新数组
c = np.vstack((a, b))
print('c:', c)

结果:

多维数组组合与拆分的相关函数

相关函数:concatenate()与split()

相关函数的用法:

np.concatenate((数组a, 数组b), axis=0)
# 通过axis作为关键字参数指定组合的方向,取值如下:
# 若待组合的数组都是二维数组:
#	0: 垂直方向组合
#	1: 水平方向组合
# 若待组合的数组都是三维数组:
#	0: 垂直方向组合
#	1: 水平方向组合
#	2: 深度方向组合
np.split(数组, 要拆分的份数, axis=0)
# 通过给出的数组与要拆分的份数,按照某个方向进行拆分,axis的取值同上

简单的一维数组组合方案

相关函数:row_stack()与column_stack()

  • 例子

代码:

import numpy as np
a = np.arange(1,9)	#[1, 2, 3, 4, 5, 6, 7, 8]
b = np.arange(9,17)	#[9,10,11,12,13,14,15,16]
#把两个数组摞在一起成两行
c = np.row_stack((a, b))
print(c)
#把两个数组组合在一起成两列
d = np.column_stack((a, b))
print(d)

结果:

ndarray类的其他属性

属性 含义
shape 维度
dtype 元素类型
size 元素数量
ndim 维数,len(shape)
itemsize 元素字节数
nbytes 总字节数 = size * itemsize
real 复数数组的实部数组
imag 复数数组的虚部数组
T 数组对象的转置视图
flat 扁平迭代器

备注:flat可以拿到数组中的每一个元素组成的迭代器。

  • 例子

代码:

import numpy as np
a = np.array([[1 + 1j, 2 + 4j, 3 + 7j],
              [4 + 2j, 5 + 5j, 6 + 8j],
              [7 + 3j, 8 + 6j, 9 + 9j]])
print(a.shape)
print(a.dtype)
print(a.ndim)
print(a.size)
print(a.itemsize)
print(a.nbytes)
print("-----------")

print(a.real, a.imag, sep='\n')
print("-----------")
print(a.T)
print("-----------")
print([elem for elem in a.flat])
print("-----------")
b = a.tolist()
print(b)

备注:data.tolist()函数为转换成列表。

结果:

发布了141 篇原创文章 · 获赞 24 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/m0_37422217/article/details/105162584