Вы можете немного ускорить процесс, описанный выше в mtrw, просто выполнив то, что вы первоначально описали (сгенерировав несколько случайных чисел, умножив и разделив соответственно) ...
Кроме того, вы, вероятно, уже знаете это, но обязательно выполняйте операции на месте (* =, / =, + = и т. Д.) При работе с массивами больших чисел. Это имеет огромное значение в использовании памяти с большими массивами и также значительно увеличит скорость.
In [53]: def rand_row_doubles(row_limits, num):
....: ncols = len(row_limits)
....: x = np.random.random((num, ncols))
....: x *= row_limits
....: return x
....:
In [59]: %timeit rand_row_doubles(np.arange(7) + 1, 1000000)
10 loops, best of 3: 187 ms per loop
По сравнению с:
In [66]: %timeit ManyRandDoubles(np.arange(7) + 1, 1000000)
1 loops, best of 3: 222 ms per loop
Это не большая разница, но если вы действительно беспокоитесь о скорости, это что-то.
Просто чтобы показать, что это правильно:
In [68]: x.max(0)
Out[68]:
array([ 0.99999991, 1.99999971, 2.99999737, 3.99999569, 4.99999836,
5.99999114, 6.99999738])
In [69]: x.min(0)
Out[69]:
array([ 4.02099599e-07, 4.41729377e-07, 4.33480302e-08,
7.43497138e-06, 1.28446819e-05, 4.27614385e-07,
1.34106753e-05])
Аналогично, для вашей "суммы строк в одну" часть ...
In [70]: def rand_rows_sum_to_one(nrows, ncols):
....: x = np.random.random((ncols, nrows))
....: y = x.sum(axis=0)
....: x /= y
....: return x.T
....:
In [71]: %timeit rand_rows_sum_to_one(1000000, 13)
1 loops, best of 3: 455 ms per loop
In [72]: x = rand_rows_sum_to_one(1000000, 13)
In [73]: x.sum(axis=1)
Out[73]: array([ 1., 1., 1., ..., 1., 1., 1.])
Честно говоря, даже если вы заново внедрите что-то в C, я не уверен, что вам удастся сильно обыграть этого ... но я могу ошибаться!