Как указано в комментариях Divakar, просто добавьте новую ось в b
.
Я предлагаю вам больше узнать о вещании , что очень полезно для векторизации вычислений в numpy: интересно, a.transpose() - b
не вызвало бы ошибку (вам понадобится
В этом вычислении форма первого массива - (3, 5)
, а b.shape
- (5). Таким образом, форма b
соответствует хвосту формы a
, и может случиться вещание. Это не тот случай, когда форма первого массива (5, 3)
, следовательно, полученная вами ошибка.
Ниже приведены некоторые тесты времени выполнения для сравнения скоростей предлагаемых ответов с вашими значениями для a
и b
: вы можете видеть, что различия не очень значительны
In [9]: %timeit (a.T - b).T
Out[9]: 1000000 loops, best of 3: 1.32 µs per loop
In [10]: %timeit a - b[:,None]
Out[10]: 1000000 loops, best of 3: 1.25 µs per loop
In [11]: %timeit a - b[None].T
Out[11]: 1000000 loops, best of 3: 1.3 µs per loop
Попробуйте SelectMany.
IEnumerable<int> Collapse(IEnumerable<IEnumerable<int>> e){
return e.SelectMany(x => x );
}
цель этой функции состоит в том, чтобы сгладить группу IEnumerable< IEnumerable< T> > в IEnumerable< T>. возвращенные данные сохранят первоначальный заказ.
В дополнение к (корректному) ответу JaredPar - также запрашивают синтаксис:
var all = from inner in outer
from item in inner
select item;
В дополнение к (корректным) основанным на LINQ ответам...
, Если Вы не хотите использовать LINQ, можно изобрести класс ChainedEnumerable, с помощью урожая:
public class ChainedEnumerable<T> : IEnumerable<T>
{
private readonly IEnumerable<T>[] _inners;
public ChainedEnumerable(params IEnumerable<T>[] inners)
{
_inners = inners;
}
public IEnumerator<T> GetEnumerator()
{
foreach (IEnumerable<T> inner in _inners)
{
foreach (T t in inner)
{
yield return t;
}
}
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
}
Использование это как это:
List<string> a = new List<string> { "A1", "A2", "A3" };
List<string> b = new List<string> { "B1", "B2", "B3" };
ChainedEnumerable<string> chainedEnumerable =
new ChainedEnumerable<string>(a, b);
foreach (string s in chainedEnumerable)
Console.WriteLine(s);