将numpy数组转换为0或1

nmpmafwu  于 2022-12-18  发布在  其他
关注(0)|答案(7)|浏览(318)
A = np.array([[0.94366988, 0.86095311, 0.88896715, 0.93630641, 0.74075403, 0.52849619
                  , 0.03094677, 0.85707681, 0.88457925, 0.67279696, 0.26601085, 0.4823794
                  , 0.74741157, 0.78575729, 0.00978911, 0.9203284, 0.02453695, 0.84884703
                  , 0.2050248, 0.03703224, 0.92931392, 0.11930532, 0.01411064, 0.7832698
                  , 0.58188015, 0.66897565, 0.75119007, 0.01323558, 0.03402649, 0.99735115
                  , 0.21031727, 0.78123225, 0.6815842, 0.46647604, 0.66323375, 0.03424828
                  , 0.08031627, 0.76570656, 0.34760863, 0.06177743, 0.6987531, 0.4106426
                  , 0.6648871, 0.02776868, 0.93053125, 0.46395717, 0.23971605, 0.9771735
                  , 0.66202407, 0.10482388]])

将a的条目转换为0(如果激活〈= 0.5)或1(如果激活〉0.5)

for i in range(A.shape[1]):
if A[i]>0.5:
    Y_prediction[i] = 1
else:
    Y_prediction[i] = 0

ValueError:具有多个元素的数组的真值不明确。请使用.any()或.all()
以及如何使用矢量化这个thx

6tdlim6h

6tdlim6h1#

我认为您需要矢量化函数np.where

B = np.where(A > 0.5, 1, 0)
print (B)
[[1 1 1 1 1 1 0 1 1 1 0 0 1 1 0 1 0 1 0 0 1 0 0 1 1 1 1 0 0 1 0 1 1 0 1 0 0
  1 0 0 1 0 1 0 1 0 0 1 1 0]]
B = np.where(A <= 0.5, 0, 1)
print (B)
[[1 1 1 1 1 1 0 1 1 1 0 0 1 1 0 1 0 1 0 0 1 0 0 1 1 1 1 0 0 1 0 1 1 0 1 0 0
  1 0 0 1 0 1 0 1 0 0 1 1 0]]

但如果只需要转换为01,则holdenweb solution更好。
如果需要转换为其他标量,如510ab,则np.where更好:

C = np.where(A > 0.5, 5, 10)
print (C)
[[ 5  5  5  5  5  5 10  5  5  5 10 10  5  5 10  5 10  5 10 10  5 10 10  5
   5  5  5 10 10  5 10  5  5 10  5 10 10  5 10 10  5 10  5 10  5 10 10  5
   5 10]]

D = np.where(A > 0.5, 'a', 'b')
print (D)
[['a' 'a' 'a' 'a' 'a' 'a' 'b' 'a' 'a' 'a' 'b' 'b' 'a' 'a' 'b' 'a' 'b' 'a'
  'b' 'b' 'a' 'b' 'b' 'a' 'a' 'a' 'a' 'b' 'b' 'a' 'b' 'a' 'a' 'b' 'a' 'b'
  'b' 'a' 'b' 'b' 'a' 'b' 'a' 'b' 'a' 'b' 'b' 'a' 'a' 'b']]

时间

np.random.seed(223)
A = np.random.rand(1,1000000)

#jez
In [64]: %timeit np.where(A > 0.5, 1, 0)
100 loops, best of 3: 7.58 ms per loop

#holdenweb
In [65]: %timeit (A > 0.5).astype(int)
100 loops, best of 3: 3.47 ms per loop

#stamaimer
In [66]: %timeit element_wise_round(A)
1 loop, best of 3: 318 ms per loop
wvt8vs2t

wvt8vs2t2#

标准的numpy广播可用于将每个元素与标量值进行比较,为每个元素生成布尔值,然后ndarray.astype方法将True值转换为1,将False值转换为零。

In [16]: (A > 0.5).astype(int)
Out[16]:
array([[1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 1, 0,
        0, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0,
        1, 0, 0, 1, 1, 0]])
bpzcxfmw

bpzcxfmw3#

np.random.seed(223)
A = np.random.rand(1000000)
A = [0 if i <=0.5 else 1 for i in A]
fquxozlt

fquxozlt4#

你的代码的问题是A[i]的维数,A被初始化为矩阵[1,n](1行n列--在np.array()中有两个括号),所以类型A[i]的引用实际上意味着“整个第i行,或者一个数组我对python和numpy还很陌生,但是访问单个单元格并将每个单元格设置为1或0可以这样编写(当然,只有在这里你被迫使用FOR循环的情况下):

for i in range(A.shape[1]):
 if A[0,i]>0.5:
    Y_prediction[0,i] = 1
 else:
    Y_prediction[0,i] = 0

但是,最好的解决方案,正如上面所描述的,无疑是避免for循环。

lnlaulya

lnlaulya5#

  • 这可能会解决您的问题 *
a=1
b=0
predict=list()
for i in A:
    if i>0.5:
        predict.append(a)
    else:
        predict.append(b)
print(predict)
  • 我们首先将值a赋值为0,B赋值为1,但您可以在append函数中直接使用1和0**“A”包含概率形式的列表,我们从该列表中分配新的列表名称predict,在比较列表中的每个项目后,我们使用append方法将值放入列表中**predict列表包含您的ans*
23c0lvtd

23c0lvtd6#

您可以使内置的round函数元素明智地使用np.vectorize

import numpy as np

element_wise_round = np.vectorize(round, otypes=[np.int])

print element_wise_round(A)

相关问题