Крест Автор: мой блог Проанализируйте данные, а не лишние
Во время моего недавнего 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 года Язык программирования , для двух основных Причины:
Это эффективный способ справиться с важным классом проблем.
Это шаг от уродливого и обратно к прекрасному.
Обе эти причины проявляются в 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”