所以我有一个尺寸为(8760,12)的numpy数组A。基本上所有的时间都是12年。我需要对阵列中每年的每个月(730小时)进行排序。我还没有找到在数组内部进行任何处理的方法。因此,我的解决方案是每个月取出一次,对其进行排序,然后再次创建整个2d数组。我当时正在考虑按照下面的方法做一些事情,但是那没有用。
total=np.zeroes([8760,12])
for j in range(1,12):
for i in range (1,12):
#here i take out every month of every year
month=A[730*(i-1):-730*(12-i),(j-1):-(12-j)]
#here I sort the data
month_sorted=np.sort(month,axis=0,kind='quicksort')
#here I try to add the sorted months back into 1 big array
np.concatenate(total,month_sorted,axis=0)
np.concatenate(total,month_sorted,axis=1)
串联不适用于大小不同的数组。
我真的没有办法将第2年的月份放在数组的第2行中。我猜应该用索引idx或iloc或类似的东西来完成。
编辑: 我的值是整数。
结果应该是每行每730(一个小时)的值从低到高排序。想象一下,我将需要3年而不是12和9个小时,而不是8760个小时,而这必须是每3个小时而不是730个小时进行排序。数组如下所示:
[[30,40,10,20,50,60,80,200,100]
[8,20,5,6,8,1,5,3,2]
[520,840,600,525,430,20,1,506,703]]
并且应转换为:
[[10,30,40,20,50,60,80,100,200]
[5,8,20,1,6,8,2,3,5]
[520,600,840,20,430,525,1,506,703]]
因此,我当前的代码取出第一部分30,40,10并将其排序为10,30,40。但是我无法解决的部分是如何从2个循环中的所有较小数组中再次创建大型数组。
答案 0 :(得分:2)
如果先创建空数组,则可以使用python索引和赋值来代替串联。
A = np.random.randint(0,99,(8760,12))
total=np.zeros([8760,12])
for j in range(12):
for i in range (12):
total[730*i:730*(i+1),j] = np.sort(A[730*i:730*(i+1),j])
如果您希望同一件事从无数组开始并且使用类似串联的函数,我会这样做
total2=None
for j in range(12):
app1 = None
for i in range (12):
app = np.sort(A[730*i:730*(i+1),j])
if app1 is None:
app1 = app
else:
app1 = np.hstack((app1,app))
if total2 is None:
total2 = app1
else:
total2 = np.vstack((total2,app1))
total2 = np.transpose(total2)
编辑以回答评论(如何将相同的排序应用于不同的数组)
bs = 3
B2 = np.empty(B.shape)
for j in range(A.shape[1]):
for i in range(int(A.shape[0]/bs)):
A2_order = np.argsort(A[bs * i : bs * (i + 1), j])
B2[bs * i : bs * (i + 1),j] = B[A2_order+i*bs,j]
答案 1 :(得分:1)
您可以避免一起循环。
首先对数组进行转置和整形,以使数组索引从粗略变为精细(年->月->小时)。
A = np.transpose(A)
A = np.reshape(A, [12, 12, 730])
现在您可以将一个月的所有时间选择为A[year, month]
为方便起见,np.sort
函数默认沿数组的最后一个轴排序,因此您可以调用
A = np.sort(A)
,现在将对A[year, month]
个条目的每个列表进行排序。