How to extract an array of same dimension as the original array meeting a condition? [duplicate]

本秂侑毒 提交于 2020-01-23 16:56:46

问题


The question sounds very basic. But when I try to use where or boolean conditions on numpy arrays, it always returns a flattened array.

I have the NumPy array

P = array([[ 0.49530662,  0.07901   , -0.19012371],
       [ 0.1421513 ,  0.48607405, -0.20315014],
       [ 0.76467375,  0.16479826, -0.56598029],
       [ 0.53530718, -0.21166188, -0.08773241]])

I want to extract the array of only negative values, but when I try

P[P<0]
array([-0.19012371, -0.41421612, -0.20315014, -0.56598029, -0.21166188,
       -0.08773241, -0.09241335])
P[np.where(P<0)]
array([-0.19012371, -0.41421612, -0.20315014, -0.56598029, -0.21166188,
       -0.08773241, -0.09241335])

I get a flattened array. How can I extract the array of the form

array([[ 0,  0,          -0.19012371],
       [ 0 , 0,          -0.20315014],
       [ 0,  0,          -0.56598029],
       [ 0, -0.21166188, -0.08773241]])

I do not wish to create a temp array and then use something like Temp[Temp>=0] = 0


回答1:


Since your need is:

I want to "extract" the array of only negative values

You can use numpy.where() with your condition (checking for negative values), which can preserve the dimension of the array, as in the below example:

In [61]: np.where(P<0, P, 0)
Out[61]: 
array([[ 0.        ,  0.        , -0.19012371],
       [ 0.        ,  0.        , -0.20315014],
       [ 0.        ,  0.        , -0.56598029],
       [ 0.        , -0.21166188, -0.08773241]])

where P is your input array.


Another idea could be to use numpy.zeros_like() for initializing a same shape array and numpy.where() to gather the indices at which our condition satisfies.

# initialize our result array with zeros
In [106]: non_positives = np.zeros_like(P)

# gather the indices where our condition is obeyed
In [107]: idxs = np.where(P < 0)

# copy the negative values to correct indices
In [108]: non_positives[idxs] = P[idxs]

In [109]: non_positives
Out[109]: 
array([[ 0.        ,  0.        , -0.19012371],
       [ 0.        ,  0.        , -0.20315014],
       [ 0.        ,  0.        , -0.56598029],
       [ 0.        , -0.21166188, -0.08773241]])

Yet another idea would be to simply use the barebones numpy.clip() API, which would return a new array, if we omit the out= kwarg.

In [22]: np.clip(P, -np.inf, 0)    # P.clip(-np.inf, 0)
Out[22]: 
array([[ 0.        ,  0.        , -0.19012371],
       [ 0.        ,  0.        , -0.20315014],
       [ 0.        ,  0.        , -0.56598029],
       [ 0.        , -0.21166188, -0.08773241]])



回答2:


This should work, essentially get the indexes of all elements which are above 0, and set them to 0, this will preserve the dimensions! I got the idea from here: Replace all elements of Python NumPy Array that are greater than some value

Also note that I have modified the original array, I haven't used a temp array here

import numpy as np

P = np.array([[ 0.49530662,  0.07901   , -0.19012371],
       [ 0.1421513 ,  0.48607405, -0.20315014],
       [ 0.76467375,  0.16479826, -0.56598029],
       [ 0.53530718, -0.21166188, -0.08773241]])

P[P >= 0] = 0
print(P)

The output will be

[[ 0.          0.         -0.19012371]
 [ 0.          0.         -0.20315014]
 [ 0.          0.         -0.56598029]
 [ 0.         -0.21166188 -0.08773241]]

As noted below, this will modify the array, so we should use np.where(P<0, P 0) to preserve the original array as follows, thanks @kmario123 as follows

import numpy as np

P = np.array([[ 0.49530662,  0.07901   , -0.19012371],
       [ 0.1421513 ,  0.48607405, -0.20315014],
       [ 0.76467375,  0.16479826, -0.56598029],
       [ 0.53530718, -0.21166188, -0.08773241]])

print( np.where(P<0, P, 0))
print(P)

The output will be

[[ 0.          0.         -0.19012371]
 [ 0.          0.         -0.20315014]
 [ 0.          0.         -0.56598029]
 [ 0.         -0.21166188 -0.08773241]]
[[ 0.49530662  0.07901    -0.19012371]
 [ 0.1421513   0.48607405 -0.20315014]
 [ 0.76467375  0.16479826 -0.56598029]
 [ 0.53530718 -0.21166188 -0.08773241]]


来源:https://stackoverflow.com/questions/55947579/how-to-extract-an-array-of-same-dimension-as-the-original-array-meeting-a-condit

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!