![](/img/trans.png)
[英]Index multiple dimensions of a multi-dimensional array with another - NumPy/ Python
[英]Change shape of multi-dimensional NumPy array without changing dimensions
我目前正在猴子修补Scikit-Learn函数,其中的一行需要2维的NumPy数组。 但是,我正在使用的数据是具有3维的NumPy数组,这会引发错误“无法解包的值太多”。
我正在调用fit
对数据进行聚类的K-Means函数。 我的问题归结为以下代码,假设X
是我传入的ndarray
:
n_samples, n_features = X.shape
X
是一个具有3维的数组,如下所示:
X = np.array([[[1, 2, 3],
[4, 5, 6]],
[[7, 8, 9],
[10, 11, 12]],
[[13, 14, 15],
[16, 17, 18]]])
数据表示一组具有6个维度的数据点的时间序列。 例如,第一个元素[[1, 2, 3], [4, 5, 6]]
将代表一个时间序列,其中包含来自2个时间段的样本,每个样本具有3个维度。
我已经用猴子修补了k_means_
代码,使我可以对ndarray
的ndarray
进行聚类。 我的目标是在2D阵列上执行k均值。
是否可以将3D ndarray的形状设置为2个元素? 例如,我尝试将3D数组转换为2D对象数组,但最终将其转换回3D数组。
np.array([[x.astype(object) for x in c] for c in combined])
同样,以下代码也将转换回3D数组。
np.array([[np.array(x) for x in c] for c in combined])
列表[[x.astype(object) for x in c] for c in combined]
看起来像它创建了正确的数组,但是由于它是list类型的,因此在该函数中不再起作用。
我正在寻找一种将3D NumPy数组“转换”为2维的方法。 任何帮助将不胜感激!
注意:我不是在寻找一种改变数组形状的方法。 我需要保留所有尺寸,但更改形状以忽略其中一个尺寸。
要创建一个数组数组,我们必须玩一些技巧,因为np.array
尽力制作一个尽可能高维的数组。 如果子数组的大小不同可以,但是如果它们都相同,我们就必须抗衡。
这是一种方法:
从3D数组开始:
In [812]: arr = np.arange(24).reshape(2,3,4)
以及大小合适(但已展平)的空对象数组
In [813]: A = np.empty((6,),object)
复制值(再次展平),并调整为目标形状
In [814]: A[:]=list(arr.reshape(-1,4))
In [815]: A=A.reshape(2,3)
In [816]: A
Out[816]:
array([[array([0, 1, 2, 3]), array([4, 5, 6, 7]), array([ 8, 9, 10, 11])],
[array([12, 13, 14, 15]), array([16, 17, 18, 19]),
array([20, 21, 22, 23])]], dtype=object)
因此,现在我们有了一个(2,3)数组,可以将其形状拆开。
我尝试从np.empty((2,3),object)
,但是无法获得A[:,:]=...
分配工作。 为了使此对象重塑工作,我们必须将arr
拆分为数组列表。 对象数组就像一个列表一样,是一个指针数组。
但是scikit
函数会接受这样的数组吗? (经过形状障碍后)。 我怀疑对象重塑是一种短视解决方案。
In [824]: [[x.astype(object) for x in c] for c in arr]
Out[824]:
[[array([0, 1, 2, 3], dtype=object),
array([4, 5, 6, 7], dtype=object),
array([8, 9, 10, 11], dtype=object)],
[array([12, 13, 14, 15], dtype=object),
array([16, 17, 18, 19], dtype=object),
array([20, 21, 22, 23], dtype=object)]]
In [825]: _[0][0].shape
Out[825]: (4,)
这将创建一个嵌套的列表列表,内部元素是(4,)对象数组。 将其包装在np.array
并使用dtype对象重新创建3d数组。
重塑,由于某种未知的原因,您不想保留数字dtype
In [828]: arr.reshape(2,-1)
Out[828]:
array([[ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
[12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]])
In [829]: arr.reshape(-1,4)
Out[829]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19],
[20, 21, 22, 23]])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.