我有一个形状4 x 129
的矩阵。我正在尝试进行水平分割,如下所示:
In [18]: x = np.arange(4*129)
In [19]: x = x.reshape(4, 129)
In [20]: x.shape
Out[20]: (4, 129)
In [21]: y = np.hsplit(x, 13)
ValueError: array split does not result in an equal division
据我所知,它不能将它平均分成13个。我不想再将零填充一列并除以13。
我想将x
矩阵拆分为13个小矩阵,其中每个12分割的大小应为4 x 10
,最后一个大小应为4 x 9
。
有没有办法这样做?
答案 0 :(得分:5)
您可以传递分割的索引,在这种情况下,您只需使用np.arange()
即可创建它们:
>>> a = np.hsplit(x, np.arange(12, 129, 12))
>>>
>>> a[0].shape
(4, 12)
>>> a[-1].shape
(4, 9)
答案 1 :(得分:2)
我不知道如何使用np.hsplit和int作为第二个参数,但环顾四周时,我发现了一种使用数组作为参数的方法。
这样做的方法是:
temp_array = [(i+1)*10 for i in range((129-1)//10)]
y = np.hsplit(x,temp_array)
或一行:
y = np.hsplit(x,[(i+1)*10 for i in range((129-1)//10)])
编辑:在创建数组时添加-1
,以防止在原始数组的大小是我们想要的子数组大小的倍数时在x的末尾创建空数组;
Edit2:另一种创建temp_array的方法是
temp_array = np.arange(10,129,10)
将所有内容放在一行:
y = np.hsplit(x,np.arange(10,129,10))
Edit3:发现使用python3时遇到了问题(使用python2测试):int分区的结果可能是浮点数。使用//
代替/
进行除法,以确保结果为int
说明:我创建了一个数组('splitting_array'),其中我想要的子数组的每个倍数都严格地在0和原始数组的大小之间。
然后我使用'splitting_array'拆分原始数组。根据numpy.split的文档,它将沿着水平轴将original_array分割为'splitting_array'给出的索引。
因此,在我们的例子中,original_array将在每个索引之前被拆分为10的倍数。
答案 2 :(得分:0)
要进行多次拆分,我们可以传递一个索引列表,描述需要拆分的位置。例如
arr = np.array([1,2,3,4,5,6,7,8,9,10])
# we want to split at Index 3,6,8, so we'll use split as
split_arr = np.split(arr, [3,6,8])
拆分意味着它将按如下方式切片
1. arr [0:3] # Index - > 0,1,2
2. arr [3:6] # Index -> 3,4,5,
3. arr [6:8] # Index -> 6,7
4. arr [8:] # Index -> 8...end
您也可以将单个拆分重塑为
split_arr.reshape(3,1)
在上面的示例中,让我们假设只有129个元素(为简单起见,不乘以4),
new_arr = np.split(arr, [13,26,39,52,65,78,91,104,117] )
在一维数组上,split
和hsplit
的工作方式相似。
希望有帮助