Рубрики
Без рубрики

Numpy еще один призрак Iverson

Cross опубликовал в моем блоге анализировать данные, а не лишние Во время моего недавнего API и Python Ad Python … с меткой Numpy, J, Python, Apl.

Крест Автор: мой блог Проанализируйте данные, а не лишние

Во время моего недавнего Smugmug API и Python Приключения меня преследуют призраком Iverson: Numpy

Призрак Iverson – это вкладывание Apl как программирование массива Особенности на языках и инструментах без APL.

Вы будете удивлены тем, как часто появляются призраки Iverson. Всякий раз, когда Программисты оспариваются с обработкой больших числовых массивов, которые они заново открывают для себя биты APL. Часто они не знают о богатом наследии языков обработки массива, но в Numpy Случай, они косвенно признал долг. В Числовой питон Авторы написали:

Языки, которые использовались для руководства разработкой Numpy Включите печально известную семейство языков APL, основу, Matlab, Fortran, S и S+и другие.

Я считаю «печально известным» обновлением от «Ошибка перенесена до совершенства».

Разработчики не только часто вызывают в воображении призраков Iverson, но и неизменно превращаются в маленьких апостолов программирования массива, которые не затмевают о том, как сокращение всех этих черновых петлей разъясняет и упрощает алгоритмы. Как научиться думать о работе на целых массивах, по сравнению с одним изящным номером за раз, освобождает разум. Почему это почти так, как будто программирование массива это инструмент мысли.

Где я слышал это раньше?

Ааа, я получил это, когда я впервые столкнулся с APL почти пятьдесят лет назад.

Да, я старый программист, окаменелость, живая реликвия. Мой мозг – это гнилый пул панковых языков программирования. Python – это только последний в длинной линии языков. Некоторые люди собирают марки. Я собираю языки программирования. И, как в том, что у коллекционеров марок есть любимые марок, я нахожу некоторые языки программирования более привлекательными, чем другие. Например, я узнаю неоспоримую полезность C/C ++ , для многих задач они являются единственными серьезными вариантами, но столь же полезными и распространенными, как C/C ++ Они никогда не щекотали меня. Нотация уродливая! Да, я сказал это; сосать это, люди. Точно так же наиболее часто используемый язык программирования в мире JavaScript одинаково уродливо. Снова JavaScript чертовски полезен, что программисты мирились со своими многочисленными бородавками. Некоторые даже сделали несколько долларов, написав книги о его скудные хорошие части Анкет

У меня есть подобные воспалительные мнения о других широко используемых языках. Тот, который делает меня несчастным, сейчас SQL , особенно вариант Microsoft T-sql Анкет На чисто эстетических основаниях я нахожу хорошо сформированным SQL Запрашиваются менее ужасны, чем ваш средний C Указатель Фест. Ядро SQL довольно элегантный, но макро -программирование, выросшие вокруг него, развращены. Я чувствую себя грязно, когда вынуждены использовать их, что является почти каждый день.

В конце моего дня программирования я хочу посмотреть на то, что прекрасное. Меня не особенно волнует, насколько полезен кусок кода или сколько денег он может заработать, или какую глупую небольшую бизнес -проблему он решает. Если проклятый код уродливый, я не хочу его видеть.

Люди продолжают заново открывать программы массива, лучше всего описать в Кен Книга Айверсона 1962 года Язык программирования , для двух основных Причины:

  1. Это эффективный способ справиться с важным классом проблем.

  2. Это шаг от уродливого и обратно к прекрасному.

Обе эти причины проявляются в Numpy Громкий успех в мире Python.

Как обычно, эффективность привела к пути. Авторы Числовой питон примечание:

Зачем эти расширения необходимы? Основная причина – очень прозаичная один, и это то, что манипулирование набором из миллиона чисел в Python со стандартными структурами данных, такими как списки, кортежи или Занятия слишком медленные и используют слишком много места.

Столкнулся с «Не вычисляет» Ситуация вы можете попробовать что -то еще, либо исправить то, что у вас есть. Люди питона зафиксировали Python с Numpy Анкет Pythonistas неохотно приняли Numpy Но быстро пошел Апостоль! Теперь книги, такие как Элегантный Scipy и все Scipy Набор инструментов, который был построен на Numpy принимать как должное.

Есть что -нибудь в Numpy Для программистов, которые пьют прохладную помощь в обработке массива в течение десятилетий? Ответ да! J программисты , в частности, находятся в удовольствии с новым аддоном Python3, который был выпущен с последней бета -версией J 8.07. Этот аддон напрямую поддерживает Numpy Массивы, позволяющие легко заменять данные в средах J/Python. Это одна из тех лучших из обоих миров.

Следующее Numpy Примеры из Scipy.org Numpy Quick Start Tutorial Анкет Для каждого Numpy Заявление, я предоставил j эквивалент. J является потомком APL. Это было в значительной степени спроектировано тем же человеком: Кен Айверсон. Адвокат по подорвам или жадный патентный тролль может рассмотреть вопрос о подаче исков Numpy Создатели после просмотра этих примеров. Влияние APL очевидно. К счастью, Кен Айверсон был больше заинтересован в продвижении хороших идей, чем получении от них. Я подозреваю, что он был бы польщен тем, что APL мутировал и колонизировал странные новые миры, и я думаю, что даже ревностные питонисты согласятся, что Python – восхитительно странный мир.

Некоторые примеры Numpy и J

Выбранные примеры из https://numpy.org/doc/1.19/user/quickstart.html Вывод был подавлен здесь. Для более подробного взгляда на эти примеры просмотрите ноутбук Jupyter: Numpy и J делают сладкую любовь .

Создание простых массивов

# numpy
a = np.arange(15).reshape(3, 5)
NB. J 
a =. 3 5 $ i. 15
# numpy 
a = np.array([2,3,4])
NB. J 
a =. 2 3 4
# numpy 
b = np.array([(1.5,2,3), (4,5,6)])
NB. J 
b =. 1.5 2 3 ,: 4 5 6
# numpy 
c = np.array( [ [1,2], [3,4] ], dtype=complex ) 
NB. J 
0 j.~ 1 2 ,: 3 4 
# numpy - make complex numbers with nonzero real and imaginary parts
c + (0+4.7j) 
NB. J - also for J
c + 0j4.7
# numpy 
np.zeros( (3,4) )  
NB. J 
3 4 $ 0  
# numpy - allocates array with whatever is in memory 
np.empty( (2,3) )  
NB. J - uses fill - safer but slower than numpy's trust memory method 
2 3 $ 0.0001 

Основные операции

# numpy 
a = np.array( [20,30,40,50] ) 
b = np.arange( 4 ) 
c = a - b  
NB. J 
a =. 20 30 40 50 
b =. i. 4 
c =. a - b  
# numpy - uses previously defined (b) 
b ** 2  
NB. J 
b ^ 2
# numpy - uses previously defined (a) 
10 * np.sin(a)  
NB. J 
10 * 1 o. a  
# numpy - booleans are True and False 
a < 35  
NB. J - booleans are 1 and 0 
a < 35

Обработка массива

# numpy 
a = np.array( [[1,1], [0,1]] ) 
b = np.array( [[2,0], [3,4]] ) 
# elementwise product 
a * b
NB. J 
a =. 1 1 ,: 0 1 
b =. 2 0 ,: 3 4 
a * b
# numpy - matrix product 
np.dot(a, b)
NB. J - matrix product 
a +/ . * b   
# numpy - uniform pseudo random 
a = np.random.random( (2,3) )
NB. J - uniform pseudo random 
a =. ? 2 3 $ 0  
# numpy - sum all array elements - implicit ravel 
a.sum(a)  
NB. J - sum all array elements - explicit ravel 
+/ , a  
# numpy 
b = np.arange(12).reshape(3,4) 
# sum of each column 
b.sum(axis=0) 
# min of each row 
b.min(axis=1) 
# cumulative sum along each row 
b.cumsum(axis=1) 
# transpose 
b.T  
NB. J  
b =. 3 4 $ i. 12 
NB. sum of each column 
+/ b 
NB. min of each row 
<./"1 b 
NB. cumulative sum along each row 
+/\"0 1 b 
NB. transpose 
|: b

Индексация и нарезка

# numpy  
a = np.arange(10) ** 3  
a[2] 
a[2:5] 
a[ : :-1]   # reversal
NB. J 
a =. (i. 10) ^ 3 
2 { a 
(2 + i. 3) { a
|. a

Оригинал: “https://dev.to/bakerjd99/numpy-another-iverson-ghost-9mc”