Доступ к многомерным массивам Perl

Я считаю, что синтаксис предыдущих ответов является избыточным и трудно запоминаемым. Пандас представил метод query() в v0.13, и я предпочитаю его. Для вашего вопроса вы можете сделать df.query('col == val')

Воспроизводится из http://pandas.pydata.org/pandas-docs/version/0.17.0/indexing.html#indexing-query

In [167]: n = 10

In [168]: df = pd.DataFrame(np.random.rand(n, 3), columns=list('abc'))

In [169]: df
Out[169]: 
          a         b         c
0  0.687704  0.582314  0.281645
1  0.250846  0.610021  0.420121
2  0.624328  0.401816  0.932146
3  0.011763  0.022921  0.244186
4  0.590198  0.325680  0.890392
5  0.598892  0.296424  0.007312
6  0.634625  0.803069  0.123872
7  0.924168  0.325076  0.303746
8  0.116822  0.364564  0.454607
9  0.986142  0.751953  0.561512

# pure python
In [170]: df[(df.a < df.b) & (df.b < df.c)]
Out[170]: 
          a         b         c
3  0.011763  0.022921  0.244186
8  0.116822  0.364564  0.454607

# query
In [171]: df.query('(a < b) & (b < c)')
Out[171]: 
          a         b         c
3  0.011763  0.022921  0.244186
8  0.116822  0.364564  0.454607

Вы также можете получить доступ к переменным в среде, добавив @.

exclude = ('red', 'orange')
df.query('color not in @exclude')

2
задан Apvast 18 January 2019 в 16:18
поделиться

3 ответа

$myarray->[1] означает «поиск индекса 1 в массиве, используя ссылку на массив, сохраненную в $myarray».

$myarray[1] означает «поиск индекса 1 в массиве @myarray».

Две переменные $myarray и @myarray не имеют никакой связи вообще.

0
ответ дан Dave Cross 18 January 2019 в 16:18
поделиться

Первый и второй примеры являются функционально эквивалентными. Один - просто синтаксический сахар для другого.

Третий семантически отличается. В то время как допустимо опускать операторы -> между индексами, это недопустимо делать между идентификаторами или вызовами и индексами подпрограмм, если переменная (или подпрограмма) содержит (или возвращает) ссылку, потому что Perl будет обрабатывать их как ссылки в этом случае.

Не существует ситуации, когда $array->[1][2] могло бы означать что-либо, кроме $array->[1]->[2], но если бы было допустимо опустить стрелку между идентификатором и первым индексом, было бы неоднозначно относительно того, просматривается ли структура, индексируемая в как [1,...] или (1,...), которые разные вещи.

0
ответ дан DavidO 18 January 2019 в 16:18
поделиться

Три точки

  1. $ myarray содержит ссылку на массив, а не на массив.
  2. $ mayarray и @myarray - разные переменные
  3. Perl на самом деле не делает многомерных массивов

Все ссылки хранятся в скалярах, поэтому все ссылки хранятся в переменные, которые начинаются с $.

[ ... ] создает анонимную ссылку на массив, поэтому [ [1, 2, 3], [4, 5, 6], [7, 8, 9]] создает анонимную ссылку на массив, содержащую 3 анонимные ссылки на массив, каждая из которых содержит 3 скаляра.

Это означает, что присвоение $ myarray присваивает ему ссылку на внешний анонимный массив.

Чтобы получить доступ к тому, на что указывает ссылка два, нужно разыменовать его. Вы можете сделать это, поместив символ для типа того, на что указывает ссылка, перед ссылкой, например @$myarray. Таким образом, $myarray[0] является первым элементом анонимного массива, содержащегося в ссылке $myarray, или вы можете использовать косвенный синтаксис $myarray->[0].

В вашем примере $myarray->[0] содержит ссылку на массив [1,2,3]. Таким образом, на эту ссылку можно ссылаться таким же образом, давая $myarray->[0]->[0] Это говорит о разыменовании $myarray и дает мне первый элемент, который является ссылкой на массив, затем разыщите это и дайте мне первый элемент этого.

Это дает вам второй пример.

Perl позволяет вам опустить -> между ] и [, а также } и { для анонимных хэшей, как синтаксический сахар. Это дает $myarray->[0][0], который является вашим первым примером.

Ваш третий пример ищет первый элемент из @myarray, который отличается от переменной $myarray. если бы вы поместили use strict в начало вашего скрипта, Perl поймал бы эту ошибку за вас.

Хорошей идеей будет поместить

use strict;
use warnings;

в качестве первых двух строк любого скрипта или модуля Perl, поскольку они будут отлавливать множество плохих и потенциально фатальных ошибок в вашей Программе. Если вы отлаживаете программу, то добавление use diagnostics в use strict дает больше подробных сообщений.

0
ответ дан JGNI 18 January 2019 в 16:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: