Вопрос:

Ошибка: значение истинности массива с более чем одним элементом неоднозначно. Используйте a.any () или a.all ()

python numpy

1394 просмотра

3 ответа

4 Репутация автора

import numpy as np
import matplotlib.pyplot as plt
import scipy
from scipy import interpolate

m_c,p_s,complete = np.loadtxt('File1.txt',usecols=(1,0,2),unpack=True)
p_d,m_d = np.loadtxt('File2.txt',usecols=(2,3),unpack=True)
p_c,m_c = np.loadtxt('File3.txt',usecols=(1,2),unpack=True)

def function_oc(m_c,p_c,complete,min,max):
    average = 0
    comp = []
    x = 0
    while x<8000:
        if p_c[x]<50 and m_c[x]>=min and m_c[x]<=max:
            comp.append(complete[x])
        x+=1
    average = sum(comp)/len(comp)
    return average

average1 = function_oc(m_c,p_c,complete,3,10) 
average2 = function_oc(m_c,p_c,complete,10,30)
average3 = function_oc(m_c,p_c,complete,30,100)
average4 = function_oc(m_c,p_c,complete,100,300)
average5 = function_oc(m_c,p_C,complete,300,1000)

def function_pc(m_d,p_d,m_c,p_c,complete):
    f= interpolate.interp2d(m_c,p_c,complete)
    comp_d = f(p_d,m_d)
    return comp_d

comp_d = function_pc(m_d,p_d,m_c,p_c,complete)

def function_d(p_d,m_d,min,max):
    d = 0
    i = 0
    while i<33:
        if p_d[i]<50 and m_d[i]>=min and m_d[i]<=max:
            d+=1
        i+=1
    return d

d1 = function_d(p_d,m_d,3,10)
d2 = function_d(p_d,m_d,10,30)
d3 = function_d(p_d,ms_d,30,100)
d4 = function_d(p_d,m_d,100,300)
d5 = function_d(p_d,m_d,300,1000)

def function_c(p_c,m_c,min,max):
    c = 0
    y = 0
    while y<12:
        if p_c[y]<50 and m_C[y]>=min and m_C[y]<=max:
            c+=1
        y+=1
    return c

c1 = function_c(p_c,m_c,3,10)
c2 = function_c(p_c,m_c,10,30)
c3 = function_c(p_c,m_c,30,100)
c4 = function_c(p_C,m_c,100,300)
c5 = function_c(p_C,m_c,300,1000)

####Missed planets in each bin####
def function_m(c_d,p_d,m_d,min,max):
    m=0
    for mi in range(len(comp_d)):
        if p_d[mi]<50 and m_d[mi]>=min and ms_d[mi]<=max:
            m += 1/comp_d[mi] - 1
    return m

m1 = function_m(comp_d,p_d,m_d,3,10)
m2 = function_m(comp_d,p_dd,m_d,10,30)
m3 = function_m(comp_d,p_d,m_d,30,100)
m4 = function_m(comp_d,p_d,m_d,100,300)
m5 = function_m(comp_d,p_d,m_d,300,1000)

occ1 = (d1+c1+m1)/average1
occ2 = (d2+c2+m2)/average2
occ3 = (d3+c3+m3)/average3
occ4 = (d4+c4+m4)/average4
occ5 = (d5+c5+m5)/average5

N = 5
dp = (d1, d2, d3, d4, d5)
cp = (c1, c2, c3, c4, c5)
mp = (m1, m2, m3, m4, m5)
planets = (dp, cp, mp)
ind = np.arange(N)
width = 0.9
p1 = plt.bar(ind, dp, width, color='red')
p2 = plt.bar(ind, cp, width, color='blue', bottom=dp)
p3 = plt.bar(ind, mp, width, color='yellow', bottom=[i+j for i,j in zip(dp, cp)])
plt.legend((p1[0], p2[0], p3[0]), ('DP', 'CP', 'MP'))
plt.show()

Я не понимаю, почему я получаю эту ошибку для моего кода:

ValueError: Значение истинности массива с более чем одним элементом неоднозначно. Используйте a.any () или a.all ()

Строка в коде, который вызывает эту проблему:

p3 = plt.bar(ind, mp, width, color='yellow', bottom=[i+j for i,j in zip(dp, cp)])
Автор: Rachel Fernandes Источник Размещён: 25.07.2017 08:05

Ответы (3)


1 плюс

106 Репутация автора

Вы получаете эту ошибку, потому что вы пытаетесь построить массив вместо точки, используя plt.bar. Т.е. вы пытаетесь построить график ind[0]против dp[0]= dp1, который является массивом. Если вы хотите сделать это, вы должны использовать plt.barдля каждой точки в массиве.

Вы должны использовать plt.barдля каждого элемента в каждом элементе dp, так что для dp[i][j].

Автор: Rein K. Размещён: 25.07.2017 08:47

1 плюс

7768 Репутация автора

Эта ошибка возникает, когда вы делаете что-то вроде:

if a < b:

когда aили bявляется массивом.

Я не могу отследить, где это может быть, так как у меня нет ваших входных текстовых файлов (и вы не предоставили полную трассировку ошибок), но у вас есть много ifутверждений, которые являются потенциальными виновниками.

Проблема в том, что a < bв случае массива разрешается массив массив логических значений, например,

array([True, True, False]) 

который ifне может разобрать. np.anyи np.allбудет анализировать массив логических значений, согласно моему примеру, Trueдля np.anyи Falseдля np.all.

Автор: Daniel F Размещён: 26.07.2017 06:14

0 плюса

1 Репутация автора

Вы должны использовать:

np.logical_or(a,b)
np.logical_and(a,b)

для массивов np. Это работает очень хорошо для меня!

Автор: Hao Xu Размещён: 11.08.2019 08:50
Вопросы из категории :
32x32