2013-09-25 3 views
2

Я смотрел на this пост, так как я хотел бы создать массив, где каждый столбец имеет один вектор xarange д по dx с соответствующим dx, соответственно. Надеюсь, это имеет смысл.Python: создание массива, которое arange

import numpy as np 
L = 80.0 
N = 2 ** np.arange(-4, 10, dtype = np.float64) 
dx = L/N 

С моим оригинальным кодом, я был смотреть на одном dx, где сейчас у меня есть массив dx значений. Когда я использовал только один dx, я настроил свой вектор х следующим образом:

x = np.arange(-L/2., L/2. - dx, dx) 

Однако мне нужно x для каждого dx, но я не уверен, о том, как это сделать. Я посмотрел на сообщение, о котором я упомянул в начале, которое, по-моему, обеспечило некоторую проницательность. По-моему, я не могу приспособить его к моим потребностям - возможно, это даже не правильный подход.

Возможно, мне нужна петля for?

for i in len(dx): 
    x[i] = np.arange(-L/2., L/2. - dx, dx) 

Тогда я бы, вероятно, нужно гнездо другой for цикл, чтобы выбрать один dx для каждой итерации.

Я не уверен, что было бы правильным или наиболее эффективным.


Чтобы прояснить путаницу, в одной dx ситуации, я имел следующие настройки:

x = np.arange(-L/2.0, L/2.0 - dx, dx)           
k = np.hstack((np.arange(0, N/2.0 - 1.0),          
       np.arange(-N/2.0, 0))).T * 2.0 * np.pi/L      
k1 = 1j * k                  
k3 = (1j * k) ** 3                 
u = 2 * (2/(np.exp(x + 20.0) + np.exp(-x - 20.0))) ** 2         
udata = u                   
tdata = 0.0 

Integration here 

Я тогда управлял метод псевдо-спектрального с Рунге-Кутта 4 интегрирования для численного определения u из нелинейное уравнение КдФ. Я хотел бы запустить код в разных значениях dx, чтобы найти ошибку и график 1/dx по сравнению с ошибкой, где 1/dx является по оси x.

Надеюсь, это поможет с тем, что я пытаюсь выполнить.


Поскольку я хочу найти ошибку, нужен ли мне такой же размер шага? Я знаю, что ошибка будет построена в виде exp(-c * dx), где c - произвольная постоянная. Я знаю это, потому что псевдоспектральный метод имеет ошибку exp(-c/dx), но я буду строить график против 1/dx.

+1

Я не знаю, как ответить на ваш вопрос, но являются ли различные варианты написания/ареала преднамеренными? Я вижу оба в тексте, но я не знаю достаточно о том, как редактировать python (если он ему даже нужен) – Gray

+1

Я не совсем уверен, что вы спрашиваете, хотите ли вы иметь массив NxM, где каждый столбец другая «аранжировка»? – bheklilr

+0

Да, я тоже не совсем понимаю вопрос. Если это то, что предлагает @bheklilr, вы можете использовать трансляцию, чтобы делать такие вещи, как 'np.arange (-2, 2) [..., None] + np.arange (3) [None, ...]' – YXD

ответ

2

Я не знаю, как вы хотите иметь дело с проблемой, что @Joel воспитан, потому что, как он стоит, имея

x = np.arange(-L/2., L/2. - dx, dx) 

Для разных dx будут давать различные массивы размера, которые не могут сложить , Вы можете создать список таких массивов, используя для цикла вы предлагаете:

L = 10 
dxs = np.array([1,2,3]) 
xs = [ np.arange(-L/2, L/2, dx) for dx in dxs ] 

Затем xs является:

[array([-5, -4, -3, -2, -1, 0, 1, 2, 3, 4]), 
array([-5, -3, -1, 1, 3]), 
array([-5, -2, 1, 4])] 

нотабене: Я удалил -dx с верхнего предела (L/2 - dx =>L/2), потому что arange уже исключает последнюю точку, которую вы можете видеть, потому что результат никогда не заканчивается L/2, который равен 5.

Если вы хотите, чтобы приращение увеличивалось при сохранении одинаковых границ, это неизбежно.


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

x = np.arange(-L/2, L/2) 
x 
#array([-5, -4, -3, -2, -1, 0, 1, 2, 3, 4]) 

x * dxs[...,None] 
#array([[ -5, -4, -3, -2, -1, 0, 1, 2, 3, 4], 
#  [-10, -8, -6, -4, -2, 0, 2, 4, 6, 8], 
#  [-15, -12, -9, -6, -3, 0, 3, 6, 9, 12]]) 
+0

Поскольку я хочу найти ошибку, нужен ли мне такой же размер шага? Я знаю, что ошибка будет построена в виде 'exp (-c * dx)' где c - произвольная константа. Я знаю это, потому что псевдоспектральный метод имеет ошибку 'exp (-c/dx)', но я буду строить график против '1/dx'. – dustin

+0

Я не уверен, что я хорошо понимаю ваше приложение, чтобы помочь. Похоже, что 'dx' - это расстояние между вашими точками, но ограничения вашей проблемы должны устанавливать границы (' L' должен быть исправлен), поэтому вы, вероятно, хотите получить первое решение. Вы не можете сделать это в массив, потому что количество точек будет отличаться для каждого 'x', поэтому ваш исходный вопрос, возможно, спорный, но это не должно быть проблемой. Просто решите его 'для x в xs'. – askewchan

Смежные вопросы