这个方法是在不改变数据内容的情况下,改变一个数组的格式,参数及返回值,官网介绍:
a:数组--需要处理的数据
newshape:新的格式--整数或整数数组,如(2,3)表示2行3列,新的形状应该与原来的形状兼容,即行数和列数相乘后等于a中元素的数量
order:
首先做出翻译: order : 可选范围为{‘C’, ‘F’, ‘A’}。使用索引顺序读取a的元素,并按照索引顺序将元素放到变换后的的数组中。如果不进行order参数的设置,默认参数为C。
(1)“C”指的是用类C写的读/索引顺序的元素,最后一个维度变化最快,第一个维度变化最慢。以二维数组为例,简单来讲就是横着读,横着写,优先读/写一行。
(2)“F”是指用FORTRAN类索引顺序读/写元素,最后一个维度变化最慢,第一个维度变化最快。竖着读,竖着写,优先读/写一列。注意,“C”和“F”选项不考虑底层数组的内存布局,只引用索引的顺序。
(3)“A”选项所生成的数组的效果与原数组a的数据存储方式有关,如果数据是按照FORTRAN存储的话,它的生成效果与”F“相同,否则与“C”相同。这里可能听起来有点模糊,下面会给出示例。
二、示例解释
1、首先随机生成一个4行3列的数组
2、使用reshape,这里有两种使用方法,可以使用npreshape(r,(-1,1),order='F'),也可以使用r1=rreshape((-1,1),order='F'),这里我选择使用第二种方法。通过示例可以观察不同的order参数效果。
通过例子可以看出来,F是优先对列信息进行 *** 作,而C是优先行信息 *** 作。如果未对r的格式进行设置,那么我们rashape的时候以“A”的顺序进行order的话,它的效果和“C”相同。
3、我们将r的存储方式进行修改,修改为类Fortan的方式进行存储。并做与第2步类似的 *** 作。
基础 *** 作样例:
1引入numpy,名称为np
2接下来创建一个数组a,可以看到这是一个一维的数组
3使用reshape()方法来更改数组的形状,可以看到看数组d成为了一个二维数组
4通过reshape生成的新数组和原始数组公用一个内存,也就是说,假如更改一个数组的元素,另一个数组也将发生改变
5同理还可以得到一个三维数组
reshape(-1,1)什么意思:
大意是说,数组新的shape属性应该要与原来的配套,如果等于-1的话,那么Numpy会根据剩下的维度计算出数组的另外一个shape属性值。
举例:
同理,只给定行数,newshape等于-1,Numpy也可以自动计算出新数组的列数。
#coding=utf-8
'''
Created on 2014-3-21
@author: Neo
'''
def PrintList(array):#输出数组
for i in range(array__len__()):
print array[i]
def SetList(array):#给数组赋值
row = 11
col = 11
for i in range(array__len__()):
for j in range(array[i]__len__()):
array[i][j] = row
row += 10
col += 1
row = col
print "赋值后的二维数组:"
PrintList(array)
return array
def InitList(x, y):
#初始化一个二维数组
array = [([0] y) for i in range(x)]
return array
def GetListByCoord(array, radius, x, y):
#根据半径来确定数组的行数和列数
row_col = 2 radius + 1
#初始化结果数组
result = InitList(row_col, row_col)
#获取传入的array的行数和列数
arrayRow, arrayCol = len(array), len(array[0])
#坐标x、y的值即为结果数组的中心,依此为偏移
for i in range(result__len__()):
for j in range(result__len__()):
if (i+x-radius < 0 or j+y-radius < 0 or
i+x-radius >= arrayRow or j+y-radius >= arrayCol):
result[i][j] = 0
else:
result[i][j] = array[i+x-radius][j+y-radius]
#打印结果
print "结果为:"
PrintList(result)
if __name__ == '__main__':
#数组7列6行
array = SetList(InitList(6,7))
GetListByCoord(array, 1, 3, 3)
GetListByCoord(array, 2, 3, 3)
GetListByCoord(array, 2, 0, 0)
GetListByCoord(array, 2, 0, 6)
GetListByCoord(array, 2, 5, 0)
GetListByCoord(array, 2, 5, 6)
运行结果为:
---------------------------------------------------------------------------------------------
赋值后的二维数组:
[11, 21, 31, 41, 51, 61, 71]
[12, 22, 32, 42, 52, 62, 72]
[13, 23, 33, 43, 53, 63, 73]
[14, 24, 34, 44, 54, 64, 74]
[15, 25, 35, 45, 55, 65, 75]
[16, 26, 36, 46, 56, 66, 76]
结果为:
[33, 43, 53]
[34, 44, 54]
[35, 45, 55]
结果为:
[22, 32, 42, 52, 62]
[23, 33, 43, 53, 63]
[24, 34, 44, 54, 64]
[25, 35, 45, 55, 65]
[26, 36, 46, 56, 66]
结果为:
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 11, 21, 31]
[0, 0, 12, 22, 32]
[0, 0, 13, 23, 33]
结果为:
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[51, 61, 71, 0, 0]
[52, 62, 72, 0, 0]
[53, 63, 73, 0, 0]
结果为:
[0, 0, 14, 24, 34]
[0, 0, 15, 25, 35]
[0, 0, 16, 26, 36]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
结果为:
[54, 64, 74, 0, 0]
[55, 65, 75, 0, 0]
[56, 66, 76, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
"""
思路:
STEP 1: 将每个子列表的第二数用列表保存起来 --> values
STEP 2: 将对应的数和其在原数组的相对应的位置下标用一个字典保存起来 -->value_position
STEP 3: 将valuse进行排序
STEP 4: 再根据排序后的顺序去value_position 找对应的位置
STEP 5: 根据原位置拿到原来的数,再按顺序将他们放进一个新的列表
STEP 6: 转化成字符串并进行相对应的处理
"""
def mySort(args):
value_position = {}
values = []
position = 0
for e in args:
valuesappend(e[1])
value_position[e[1]] = position
position+=1
valuessort()
#d = [ value_positionget(key) for key in values]
result = [ ''join(str(args[p]))for p in [ value_positionget(key) for key in values]]
return ''join(result)replace('[',' ',)replace(']',',')replace(',',' ') #比较丑,应该有更简单的方法
a = [[1,2],[3,1],[4,0]]
print 'previous list :%s: '%a
print 'post list: %s: '%mySort(a)
以上就是关于python基础之numpy.reshape详解全部的内容,包括:python基础之numpy.reshape详解、python 查找二维数组的相邻元素、关于python数组中的数组的处理等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)