Функції сітчастої сітки в Python (meshgrid mgrid ogrid ndgrid)


76

Я шукаю чіткого порівняння функцій meshgrid-подібних. На жаль, я не знаходжу!

Numpy http://docs.scipy.org/doc/numpy/reference/ надає

  • mgrid

  • ogrid

  • meshgrid

Scitools http://hplgit.github.io/scitools/doc/api/html/index.html надає

  • ndgrid

  • boxgrid

В ідеалі таблиця, що узагальнює все це, була б ідеальною!

Відповіді:


82

numpy.meshgridмоделюється за meshgridкомандою Matlab . Він використовується для векторизації функцій двох змінних, щоб ви могли писати

x = numpy.array([1, 2, 3])
y = numpy.array([10, 20, 30]) 
XX, YY = numpy.meshgrid(x, y)
ZZ = XX + YY

ZZ => array([[11, 12, 13],
             [21, 22, 23],
             [31, 32, 33]])

Таким чином, ZZмістить усі комбінації xта yвкладених у функцію. Якщо ви задумаєтесь, meshgridце трохи зайве для numpy-масивів, оскільки вони транслюються. Це означає, що ви можете це зробити

XX, YY = numpy.atleast_2d(x, y)
YY = YY.T # transpose to allow broadcasting
ZZ = XX + YY

і отримати той самий результат.

mgridі ogridє допоміжними класами, які використовують позначення індексу, щоб ви могли створювати їх XXі YYв попередніх прикладах безпосередньо, не використовуючи щось подібне linspace. Порядок, у якому генеруються результати, зворотний.

YY, XX = numpy.mgrid[10:40:10, 1:4]
ZZ = XX + YY # These are equivalent to the output of meshgrid

YY, XX = numpy.ogrid[10:40:10, 1:4]
ZZ = XX + YY # These are equivalent to the atleast_2d example

Я не знайомий з матеріалами scitools, але, ndgridздається, це рівнозначно meshgrid, хоча BoxGridнасправді цілий клас, який допомагає в цьому поколінні.


Дякуємо за Ваш відповідь. Але я не розумію, що мені слід використовувати, якщо у мене є 3 параметри (або більше), назвемо їх x1, x2, x3!
scls

2
Meshgrid явно 2D. Всі інші підтримують більше вимірів. Це насправді пояснювало б існування ndgrid.
chthonicdaemon

3
Результати meshgrid та mgrid різні. Просто спробуйте mgrid [1: 4, 1: 4] та meshgrid ([1,2,3], [1,2,3]).
FJDU

1
У другому розділі, де ви XX = XX.Tце робите, це повинно бути справді YY = YY.T. Це стає очевидним, якщо x і y різні.
MountainX

чому ви хотіли б уникати використання Linspace?
Мануель Пена

7

np.mgridі np.meshgrid()зробити те саме, але перша і друга вісь поміняні місцями:

# 3D
d1, d2, d3 = np.mgrid[0:10, 0:10, 0:10]
d11, d22, d33 = np.meshgrid(np.arange(10),np.arange(10),np.arange(10))
np.array_equal(d1,d11)

врожайність False. Просто поміняйте місцями перші два виміри:

d11 = np.transpose(d11,[1,0,2])
np.array_equal(d1,d11)

врожайність True.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.