2012-10-25 14 views
6

To jest podstawowe pytanie dotyczące manipulacji listami w Mathematica. Mam dużą listę, gdzie każdy element ma następujący schemat: {Lista1, Lista2, Liczba}. Na przykład:Szybkie wyodrębnianie elementów z list zagnieżdżonych

a = {{{1,2,3},{1,3,2},5},{{1,4,5},{1,0,2},10},{{4,5,3},{8,3,4},15}}}.

Chcę utworzyć nową listę, która ma tylko niektóre części z każdej podlisty. Np. Wybierz trzeci element z każdej podlisty, aby uzyskać {5,10,15} z powyższego. Lub zrzuć trzeci element, by wrócić {{{1,2,3}, {1,3,2}}, {{1,4,5}, {1,0,2}}, {{4,5, 3}, {8,3,4}}}.

mogę to zrobić za pomocą polecenia stół do skonstruowania nowych list, np

Table[a[[i]][[3]],{i,1,Length[a]} 

ale zastanawiałem się, czy nie było wolno szybszy sposób, który będzie działać na dużych listach.

Odpowiedz

7

W Mathematica w wersji 5 lub nowszy, można użyć słowa kluczowego W wielu sposobów, aby określić listę przechodzenie

Na przykład, zamiast Tabeli można pisać:

a[[All,3]] 

Tutaj Mathematica konwertuje Wszystkie do wszystkich dopuszczalnych indeksów dla pierwszego wymiaru następnie bierze trzeci z następnego wymiaru.

Zazwyczaj jest to bardziej skuteczne niż tworzenie pętli z językiem programowania Mathematica. To jest naprawdę dobre dla homogenicznych list, gdzie rzeczy, które chcesz wybrać lub skanować zawsze istnieją.

Inną wydajną notacją i skrótem jest ;; składnia:

a[[ All, 1 ;; 2]] 

skanuje pierwszy poziom a i wziąć wszystko od 1 do 2st elementem każdego podmenu, dokładnie tak jak swoim drugim przypadku.

W rzeczywistości Wszystkie i ;; można łączyć na dowolną liczbę poziomów. ;; nawet może być stosowany w sposób podobny do każdego iteratora w Mathematica:

a[[ start;;end;;step ]] 

zrobi to samo, co

Table[ a[[i]], {i,start,end,step}] 

i można pominąć jedną rozpoczęciu, zakończeniu lub etapu, to jest wypełnione jego domyślna 1, długość [(listy niejawny)], a 1.

Kolejną rzeczą może chcesz do wyszukiwania w Pomocy Mathematica są ReplacePart i MapAt które umożliwiają wymianę programową wyrażeń strukturyzowanych. Kluczową rzeczą do efektywnego wykorzystania tej funkcji jest to, że w ReplacePart można użyć patterns, aby określić współrzędne rzeczy do zastąpienia, a także zdefiniować funkcje, które można do nich zastosować.

Przykład z danymi

ReplacePart[a, {_, 3} -> 0] 

zastąpi każdy 3rd część każdego z podmenu 0.

ReplacePart[a, {i : _, 3} :> 2*a[[i, 3]]] 

podwoi każdy 3rd część każdego podmenu.

+0

Dzięki; tego właśnie szukałem. – bartimaeus

+1

Należy pamiętać, że w przypadku dalszych pytań można również poprosić o http://mathematica.stackexchange.com – ogerard

1

Można użyć Part (skrótowej [[...]]) dla tego:.

a[[All, 3]] 

a[[All, {1, 2}]] 
2

Jako autorzy sugerują, że podejście oparte na części potrzebujemy sensownych danych, ale walizki jest zbudowany na solidnej separacji list:

Korzystanie z komputera A,

a = {{{1, 2, 3}, {1, 3, 2}, 5}, {{1, 4, 5}, {1, 0, 2}, 
10}, {{4, 5, 3}, {8, 3, 4}, 15}}; 

Cases[a,{_List,_List,n_}:>n,Infinity] 

{5, 10, 15} 

drugiej kawałki Rekord może być wyodrębniony za pomocą podobnych formularzy.

podejścia Część oparte będzie gag na źle sformułowane dane jak:

badA = {{{1, 2, 3}, {1, 3, 2}, 5}, {{1, 4, 5}, {1, 0, 2}, 
10}, {{4, 5, 3}, {8, 3, 4}, 15}, {baddata}, {{1, 2, 3}, 4}}; 

badA[[All,3]] 

{{{1, 2, 3}, {1, 3, 2}, 5}, {{1, 4, 5}, {1, 0, 2}, 
10}, {{4, 5, 3}, {8, 3, 4}, 15}, {baddata}, {{1, 2, 3}, 
4}}[[All, 3]] 

, ale walizki będzie przeskoczyć śmieci, działający tylko na zgodnych danych

Cases[badA, {_List, _List, s_} :> s, Infinity] 

{5, 10, 15} 

HTH,

Fred Klingener

Powiązane problemy