Линспейс с автоматическим количеством очков - PullRequest
0 голосов
/ 23 сентября 2018

При использовании np.linspace следующим образом:

x[a:int(b*2.2+5)] = np.linspace(234.0, 23.4, ...

необходимо:

  • либо повторить фрагмент массива:

    x[a:int(b*2.2+5)] = np.linspace(234.0, 23.4, len(x[a:int(b*2.2+5)]))
    
  • или вычислите его длину:

    x[a:int(b*2.2+5)] = np.linspace(234.0, 23.4, int(b*2.2+5)-a)
    
  • или используйте другую переменную:

    r = range(a,int(b*2.2+5))
    x[r] = np.linspace(234.0, 23.4, len(r))
    
  • или создайте фрагмент:

    x2 = x[a:int(b*2.2+5)]
    x2 = np.linspace(234.0, 23.4, len(x2))
    

    (последний не будет работать, потому что он не будет изменять x, как требуется)

Есть ли более короткий способ, который бы автоматически определял длину? , например:

x[a:int(b*2.2+5)] = np.autolinspace(234.0, 23.4)

Или есть встроенная функция Numpy:

linspace(234.0, 23.4, destination_array=x[a:int(b*2.2+5)])

Ответы [ 2 ]

0 голосов
/ 23 сентября 2018

Вариант вашего последнего отклоненного решения работает

In [180]: x=np.zeros(20)
In [181]: x2=x[2:10]
In [182]: x2[:] = np.linspace(0,1,len(x2))
In [183]: x
Out[183]: 
array([0.        , 0.        , 0.        , 0.14285714, 0.28571429,
       0.42857143, 0.57142857, 0.71428571, 0.85714286, 1.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ])

x2 - это view, поэтому его изменение действительно изменяет x.

Самое чистое решение, которое я могудумать о том, чтобы начать с slice объекта:

In [188]: idx = slice(2,10)
In [189]: x[idx] = np.linspace(1,2,idx.stop-idx.start)
In [190]: x
Out[190]: 
array([0.        , 0.        , 1.        , 1.14285714, 1.28571429,
       1.42857143, 1.57142857, 1.71428571, 1.85714286, 2.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ,
       0.        , 0.        , 0.        , 0.        , 0.        ])
0 голосов
/ 23 сентября 2018

Я думаю, что из-за правила lvalue vs rvalue, поскольку rvalue оценивается первым, невозможно автоматически определить длину, как то, что вы просили.

Один из способов будет, если вы напишите пользовательскую оболочку над массивами numpy и правильно переопределите __setitem__.Но это слишком много проблем, чем удобство для меня.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...