Ошибка типа: tri() отсутствует 1 требуемый позиционный аргумент: ‘N’

#python #typeerror #cvxpy #convex-optimization #convex

Вопрос:

Я не могу пройти мимо ошибки:

 > ---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-4-3e1d3e33fb00> in <module>()
      7 d_unpair = np.random.beta(n,n)
      8 d_pair = np.random.beta(2,2,size=n)*0.20
----> 9 d = np.tril(d_unpair) np.tril(d_unpair, -1).T-np.diag(d_unpair)*delta d_pair*delta
     10 G=np.zeros((n,n))
     11 g = A/d**3.5

<__array_function__ internals> in tril(*args, **kwargs)

/usr/local/lib/python3.7/dist-packages/numpy/lib/twodim_base.py in tril(m, k)
    432     """
    433     m = asanyarray(m)
--> 434     mask = tri(*m.shape[-2:], k=k, dtype=bool)
    435 
    436     return where(mask, m, zeros(1, m.dtype))

TypeError: tri() missing 1 required positional argument: 'N'
 

Это было сделано в исследовательских целях, и я напечатал его точно так, как это было в этой исследовательской статье. (Гиперссылка). [Второй, если быть точным.].
Первый код работал нормально, но я просто не могу передать эту ошибку во втором коде.

Код

 import cvxpy as cvx
import numpy as np
np.random.seed(100)
n = 3 #number of transmitter = receiver
A = 0.025 #uniform receiver coefficient
delta = np.identity(n) #identity matrix
d_unpair = np.random.beta(n,n)
d_pair = np.random.beta(2,2,size=n)*0.20
d = np.tril(d_unpair) np.tril(d_unpair, -1).T-np.diag(d_unpair)*delta d_pair*delta
G=np.zeros((n,n))
g = A/d**3.5
S_hat=G*delta
I_hat = G-S_hat
σ = 5.0*np.ones(n)
γ = 1.0
Pmax = 1.0
p=cvx.Variable(n)
obj = cvx.Minimize(cvx.sum(p))
constraints = [p>=0, S_hat*p-γ*(I_hat*p σ)>= 0, p <=Pmax]
prob=cvx.Problem(obj, constraints)
prob.solve()
powers = np.asarray(p.value)
print('Solution status ={0}'.format(prob.status))
print('Optimal solution ={0:.3f}'.format(prob.value))
if prob.status == 'optimal':
  for j in range(n):
    print('Power{0}={1:.3f}'.format(j,powers[j]))
 

Я никогда раньше не работал с модулем CVXPY, поэтому я просмотрел несколько примеров вопросов здесь, в переполнении стека, но ни один из них не соответствовал моей проблеме, почти все они относились к "TypeError: Missing 1 required positional argument: 'self'"

Как я могу это исправить, чтобы это давало правильный результат?

Ответ №1:

Добавить size=1 в вызов numpy.random.beta , которому d_unpair назначено:

 d_unpair = np.random.beta(n, n, size=1)
 

Ошибка возникает из numpy.random.beta -за того, что имеет значение по умолчанию size=None , которое заставляет метод возвращать скалярное значение (в данном случае с плавающей точкой), что, в свою очередь, является плохим аргументом numpy.tril . Установка size=1 делает numpy.random.beta возврат a ndarray .