个人手记
注意:在pycharm中不能将文件名命名为已有模块名
一、导入numpy作为np,并查看版本和安装位置import numpy as np
print(np.__version__,'/n',np.__file__)二、在NumPy中,数组这一类又被称为ndarray。
1、ndarray.ndim
指数组的维度,即数组轴(axes)的个数,其数量等于秩(rank)。
通俗地讲,我们平时印象中的数组就是一维数组,维度为1、轴的个数为1、秩也等于1;
最常见的矩阵就是二维数组,维度为2、轴的个数为2(可以理解为由x轴、y轴组成)、秩等于2;我们所知的空间就相当于三维数组,
维度为3、轴的个数为3(x、y、z轴)、秩等于3;以此类推。
2、ndarray.shape
按教程的话翻译过来是数组的维度,这样就很容易和ndim的概念混淆。
所以可以这样理解,shape的返回值是一个元组,元组的长度就是数组的维数,即ndim。
而元组中每个整数分别代表数组在其相应维度(/轴)上的大小。
以最常见的矩阵为例,print shape后返回(2,3),说明这是一个2行3列的矩阵。
3、原型:np.arange([start,] stop[, step,], dtype=None) 要省略都省略,不然就写全
参数一:数组开始的数字start
参数二:数组结束的数字stop
参数三:数组累加的步长step
参数四:数组内元素的数据类型dtype
“The type of the output array. If `dtype` is not given, infer the data
type from the other input arguments.”
返回值:生成一个 N维数组对象ndarray(快速而灵活的大数据集容器)
该对象由两部分组成:1、实际的数据;2、描述这些数据的元数据;
用法一:只有一个参数,表示个数,从0开始。
用法二:齐全参数,表示生成一个一定范围内数组。
4、原型:numpy.full(shape, fill_value, dtype=None, order='C') 生成给定形状和数据类型的数组;
参数一:shape规定数组类型(2,3)表示二行三列的二维数组;
参数二:fill_value填充的数据值;
参数三:dtype规定类型;
参数四:order在内存中以行主(C风格)或列主(Fortran风格)顺序存储多维数据。
5、原型:numpy.ones(shape, dtype = None, order = 'C')
生成指定形状的数组 默认数组元素以浮点数 1. 来填充
6、原型:np.where(condition[, x, y])
共有三种用法:
用法一>
传入三个参数的时候,满足条件输出x,不满足条件输出y
用法二>
传入一个数组参数的时候,输出非0元素
用法三>
传入一个判断条件参数的时候,输出满足条件的元素
7、原型:numpy.reshape(a, newshape, order='C')不改变数组数据的前提下,改变数组的形状
参数一a:被修改的数组名
参数二:新的数组的形状,通常是整数或者整型数组
参数三:通常是CFA三个值 返回值是一个新的视图,不然就复制一份
注意:
(1)如果新的数组和原来的数组大小不一致,那么不能原数组承接新形状数组。
(2)如果原数组元素不能大于新数组的元素个数。
以上两条均会爆出ValueError: cannot reshape array of size 21 into shape (2,15)错误
补充:
C-style order是以行为主,存储格式为a[0][0],a[0][1],a[1][0],a[1][1],矩阵运算比较友好
F-style order是以列为主,存储格式为a[0][0],a[1][0],a[0][1],a[1][1],科学计算友好。
A 按照他存的顺序读取,存C-style就按照C读,存F-style就按F读取 新形状中如果设置为-1:
缺省值-1代表不知道要给行(或者列)设置为几,reshape函数会根据原矩阵的形状自动调整。
8、原型:np.concatenate((a1, a2, …), axis=0) 数组拼接
参数(a1, a2, …):表示要拼接的数组
参数axis:默认是0表示纵向拼接垂直堆叠;1表示横向拼接水平堆叠
9、原型:np.repeat(a,repeats,axis=None)
参数一:传入一个数组
参数二:数组每个元素重复的次数
参数三:axis=None时候就会flatten当前矩阵,实际上就是变成了一个行向量; axis=0,沿着y轴复制,实际上增加了行数; axis=1,沿着x轴复制,实际上增加列数;
10、原型:numpy.tile(A,reps) 整个函数用于重复数组A来构建新的数组
参数一:传入一个数组A
参数二:reps则决定A重复的次数,新数组的维度为max(reps.ndim,A.ndim)
注意: numpy的数组没有tile属性,该属性是属于上级numpy的。
报错信息:'numpy.ndarray' object has no attribute 'tile'
11、原型:np.r_ 列不变行累加(纵向扩展) 按列连接两个矩阵,就是把两矩阵上下相加,要求列数相等,类似于pandas中的concat()。
12、原型:np.c_ 行不变列累加(横向扩展) 按行连接两个矩阵,就是把两矩阵左右相加,要求行数相等,类似于pandas中的merge()。
13、原型:numpy.intersect1d(ar1,ar2,assume_unique=False, return_indices=False)
参数一二:需要求的数组名
参数三:bool,默认为False,True假定数组唯一
参数四:bool,默认为False,True返回两数组交集的索引,如有多个值,第一个优先
return:一个数组。1、公共元素组成的数组 2、arr1第一次出现公共值的索引 3、arr2第一次出现公共值的索引
14、原型:numpy.setdiff1d(ar1, ar2, assume_unique=False) 从集合ar1中找到与ar2不同的元素组成新的数组返回。
15、原型:numpy.where(condition[, x, y]) 返回x或y中符合condition的元素。
如果condition为true返回x
用法一:只有condition一个参数的时候,功能是简写的 np.asarray(condition).nonzero(); 总之就是在调用nonzero函数。
16、原型:numpy.nonzero(a) 返回非零元素的索引。
17、原型:class numpy.vectorize(pyfunc, otypes=None, doc=None, excluded=None, cache=False, signature=None) 向量化函数。
参数一:pyfunc函数和方法
参数二:输出数据类型。必指为一个typecode字符串或数据类型说明符列表。每个输出应该有一个数据类型说明符。
参数三:如果为None,则docstring将是 pyfunc.__doc__。
参数四:表示函数不会向量化的位置或关键字参数的字符串或整数集。这些将直接传递给未经修改的pyfunc
参数五:如果为True,则缓存第一个函数调用,该函数调用确定未提供otype的输出数。
参数六:广义通用函数签名,例如,(m,n),(n)->(m)用于矢量化矩阵 - 向量乘法。如果提供的话,pyfunc将调用(并期望返回)具有由相应核心维度的大小给出的形状的数组。默认情况下,pyfunc假定将标量作为输入和输出。 vectorized :向量化的数组
三、numpy训练
问题1:创建从0到9的一维数字数组arr = np.arange(0,9,1,dtype=float)
print(arr)问题2:创建一个numpy2*2数组元素值全为True(真)的数组numArrF = np.full((2,2),True,dtype = bool,order = 'C')
print(numArrF)
numArrOB = np.ones((3,3), dtype=bool)
print(numArrOB)
numArrOI = np.ones((3,2),dtype = int)
print('输出ones建立的数组:',numArrOI)问题3:创建一个0-30的数组,从 arr 中提取所有的奇数numArr = np.arange(6,30,1,dtype = int)
print('输出数组:',numArr)
print('查找数组所有的奇数:',numArr[numArr % 2 == 1]) #使用数组名来获取下标'''
print('numpy的where函数查找数组值所匹配的下标:',np.where(numArr == 8))问题4:将上一问题的numArr中所有奇数替换为-1。取出直接赋值替换
numArr[numArr % 2 == 1] = -1
print('原数组替换数组值:',numArr)问题5:将arr中的所有奇数替换为-1,而不改变arr。numArr = np.arange(1,20,1,dtype= float)
print(numArr)
print(np.where(numArr % 2 == 1, -1, numArr))问题6:将一维数组转换为2行的2维数组arrShape = np.arange(2,24,1,dtype = int )
print('arrShape未修改元素:\n',arrShape)
#下面两种用法均可
arrShapenew1 = arrShape.reshape((2 ,-1), order = 'C')
print('new arrShape first:\n',arrShapenew1)
arrShapenew2 = np.reshape(arrShape,(2,-1),order = 'C')
print('new arrShape second:\n',arrShapenew2)问题7:何为水平堆叠?何为垂直堆叠?
水平堆叠:纵向拼接,axis=1,表示以横轴为基准,将数组横向拼接
垂直堆叠:与上相反
问题8:垂直堆叠和水平堆叠数组a和数组barr1 = np.arange(10).reshape(2,-1)
arr2 = np.repeat(1,10).reshape(2,-1)
print('纵向拼接(垂直堆叠):\n',np.concatenate((arr1,arr2), axis = 0))
print('横向拼接(水平堆叠):\n',np.concatenate((arr1,arr2), axis = 1))
print('append拼接:\n',np.append(arr1,arr2)) #一维追加,行不变,列总和
print('stack拼接:\n',np.stack([arr1,arr2])) #分两个数组进行堆叠
print('hstack拼接(水平堆叠):\n',np.hstack([arr1,arr2])) #行和行相拼接
print('vstack拼接(垂直堆叠):\n',np.vstack([arr1,arr2])) #列和列相拼接
print('dstack拼接(垂直堆叠):\n',np.dstack([arr1,arr2])) #两数组的每个元素相组合形成一个新的数组,作为新数组的元素。
#使用np.r_[a,b]整合多个数组为一个数组,行相等,列累加
print('np.r_[a,b]列不变行累加:\n',np.r_[arr1,arr2])
print('np.c_[a,b]行不变列累加:\n',np.c_[arr1,arr2])问题9:何为硬编码?何为软编码?
硬编码>将可变变量用一个固定数值表示,不可修改;(写死了,不能改了)
软编码>通过一个标记取代变量名称,而这个标记的值是可以不断变化的。(跟随)
如何在无硬编码的情况下生成numpy中的自定义序列?
问题10:创建以下模式而不使用硬编码。只使用numpy函数和下面的输入数组a
给定: a = np.array([1,2,3])
期望的输出:
array([1, 1, 1, 2, 2, 2, 3, 3, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3])aa = np.array(([1,2,3],[4,5,6]))
a = np.array([1,2,3])
print('a的ndim = ',a.ndim)
print('aa的ndim = ',aa.ndim)
print('默认none复制:\n',a.repeat(3)) #按元素复制,生成一维数组
print('按行复制:\n',aa.repeat(3,axis=0)) #按行复制 “需要弄明白:axis为0表示的y轴是哪个?”
print('按列复制:\n',aa.repeat(3,axis=1)) #按列复制 “疑问:为什么一维数组不能进行按列复制,增加列”
print('每行对应的复制的次数,要和数组的行对应:\n',aa.repeat([4,3],axis=0)) #每行对应的复制的次数,要和数组的行对应
print('每列对应的复制次数,要和数组的列数对应:\n',aa.repeat([2,3,4],axis=1)) #每列对应的复制次数,要和数组的列数对应
print('重复数组\n',np.tile(a,3))
print('实现生成自定义数组R:\n',np.r_[a.repeat(3),np.tile(a,3)])
print('实现生成自定义数组C:\n',np.c_[a.repeat(3),np.tile(a,3)])问题11:获取数组a和数组b之间的公共项。
给定:a = np.array([1,2,3,2,3,4,3,4,5,6])
b = np.array([7,2,10,2,7,4,9,4,9,8])
期望的输出:array([2, 4])a = np.array([1,2,3,2,3,4,3,4,5,6])
b = np.array([7,2,10,2,7,4,9,4,9,8])
print('使用交集,按位取公共元素项:\n', np.intersect1d(a,b,return_indices = True)) #注意intersect1d中倒数第二个字母为数字1不是字母L问题12:从数组a中删除数组b中的所有项。
给定:a = np.array([1,2,3,4,5])
b = np.array([5,6,7,8,9])
期望的输出:array([1,2,3,4])a = np.array([1,2,3,4,5])
b = np.array([5,6,7,8,9])
print('setdiff1d实现删除其他存在项:\n',np.setdiff1d(a,b,assume_unique= True ))问题13:获取a和b元素匹配(相等)的位置(索引)。
给定:a = np.array([1,2,3,2,3,4,3,4,5,6])
b = np.array([7,2,10,2,7,4,9,4,9,8])
期望的输出:(array([1, 3, 5, 7]),)a = np.array([1,2,3,2,3,4,3,4,5,6])
b = np.array([7,2,10,2,7,4,9,4,9,8])
print('使用where筛选符合条件元素的索引:\n',np.where(a == b))
print('返回匹配的元素\n',a==b)
print('使用 nonzero筛选符合条件的元素索引:\n',np.nonzero( a==b ))问题14:获取5到10之间的所有项目。
给定:a = np.array([2, 6, 1, 9, 10, 3, 27])
期望的输出:(array([6, 9, 10]),)print('\n获取5到10之间的所有项目:')
a = np.array([2, 6, 1, 9, 10, 3, 27])
print('a[np.where((a>=5) & (a<=10))] = ',a[np.where((a>=5) & (a<=10))]) #条件要取优先级括号
print('a[np.where(np.logical_and(a>=5,a<=10))] = ',a[np.where(np.logical_and(a>=5,a<=10))])
print('a[(a>=5)&(a<=10)] = ',a[(a>=5)&(a<=10)])scalar标量数据,python只有一种特定数据类型(整形和浮点型)
在研究科学数据计算领域远远不够,numpy中用拥有24种数据类型描述标量scalar;
numpy默认数据类型是float,int_不是继承python3的。
问题15:适用于转换两个标量的函数maxx,以求两个数组的最大值。
给定:
def maxx(x, y): #求两个最大值
if x >= y:
return x
else:
return y
maxx(1, 5)
# > 5
期望的输出:
a = np.array([5, 7, 9, 8, 6, 4, 5])
b = np.array([6, 3, 4, 8, 9, 7, 1])
pair_max(a, b)
# > array([ 6., 7., 9., 8., 9., 7., 5.])print('定义函数按位求解两个数组的最大值:\n',)
def maxArr(x,y):
if x>y:
return x
else:
return y
a = np.array([2,4,5,2,15,53,3,9])
b = np.array([5,3,2,6,25,26,7,1])
maxA = np.vectorize(maxArr,otypes=[int]) #自定义函数返回的值是什么?为何无法输出? 参数传入的值
print(maxA(a,b))问题16:建立一个三行三列数组,交换第一列和第二列a = np.arange(0,18,2,dtype = int ).reshape(3,3)
print('原数组:\n',a)
aa = a[:,[1,0,2]]
print('交换0 1两列后:\n',aa) #普通的建立temp交换是没有用
python 拓展维度 python中维度
转载本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
Java Chassis 3:接口维度负载均衡
Java Chassis 3通过接口维度负载均衡的策略设置,为不同的应用场景提供了非常强大的负载均衡管理能力,帮助解决负载不均衡、会话粘滞等应用负载问题。
负载均衡 微服务 Java Java Chassis 3