Python 具有列表理解的逻辑索引

Python 具有列表理解的逻辑索引,python,list-comprehension,matrix-indexing,Python,List Comprehension,Matrix Indexing,我的代码目前如下: z = np.diagflat(c).dot(D).dot(x); idxN, idxP = z<0, z>=0 # logical indexing y1 = [-1 + np.exp(x)/(1+np.exp(x)) for x in z[idxN]] y1 = np.array(y1) # Size (504,) y2 = [-np.exp(-x)/(1+np.exp(-x)) for x in z[idxP]] y2 = np.array(y2) # Si

我的代码目前如下:

z = np.diagflat(c).dot(D).dot(x);
idxN, idxP = z<0, z>=0 # logical indexing
y1 = [-1 + np.exp(x)/(1+np.exp(x)) for x in z[idxN]]
y1 = np.array(y1) # Size (504,)
y2 = [-np.exp(-x)/(1+np.exp(-x)) for x in z[idxP]]
y2 = np.array(y2) # Size (496,)
z=np.diagflat(c)、点(D)、点(x);
idxN,idxP=z=0#逻辑索引
y1=[-1+np.exp(x)/(1+np.exp(x))表示z中的x[idxN]]
y1=np.数组(y1)#大小(504,)
y2=[-np.exp(-x)/(1+np.exp(-x))表示z中的x[idxP]]
y2=np.数组(y2)#大小(496,)
现在我正试图形成一个(1000,)列表
y
,它将根据索引是+/-合并y1还是y2

我猜列表理解是最简单的,但我正在努力使用表单。感谢您的输入。

最简单的方法应该是使用索引设置值,然后根据需要将其展平:


PS:当您将一个数据阵列子集以创建另一个1D数组时,会丢失原始数据阵列的索引信息。因此,对于列表理解,您可能需要同时枚举新创建的1D数组和原始ndarray

正如我正确理解的那样,您有两个逻辑数组
idxN
idxP
,每个都有1000个元素?@Colonder:是的,这是正确的。这确实有效。我的印象是,负指数语句的z_out[idxN]=y1#值不适合Python。我以前也试过类似的方法,但都不管用。是的,这种情况有时会发生。如果要创建新数组或覆盖该数组及其所涉及的数据类型,则需要小心。这就是我在为这种情况分配值之前明确指定
dtype
float
的原因。
z_out = np.empty(z.shape, dtype='float')
z_out[idxN] = y1                           # values for negative indices
z_out[idxP] = y2                           # values for positive indices

z_out.flatten()                            # flatten it to 1D array, if required