Вы можете настроить это:
import matplotlib.pyplot as plt
import matplotlib
mat = [[ 150. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ],
[ 150. , 69.388 , 35.36 , 18.211, 7.851, 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , -0.03 , -0.047 , -0.044 , -0.027 , 0. ],
[ 150. , 92.192 , 53.842 , 29.633,13.192, 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , -0.075 , -0.112 , -0.104 , -0.062 , 0. ],
[ 150. , 95.538 , 58.184 , 33.287,15.285, 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , -0.156 , -0.221 , -0.199 , -0.116 , 0. ],
[ 150. , 81.776 , 50.068 , 30.045,14.659, 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , -0.331 , -0.416 , -0.357 , -0.203 , 0. ],
[ 0. , 31.498 , 30.267 , 22.168,13.308, 5.653, 2.766 , 1.5 , 0.86 , 0.492 , 0.254 , 0.082, -0.058, -0.182 , -0.298 , -0.41 , -0.515 , -0.617, -0.751 , -0.754 , -0.609 , -0.34 , 0. ],
[ 0. , 13.948 , 17.335 , 15.05 ,10.751, 6.537, 3.913 , 2.374 , 1.447 , 0.854 , 0.443 , 0.13 , -0.132, -0.372 , -0.602 , -0.826 , -1.034 , -1.204, -1.301 , -1.241 , -0.985 , -0.548 , 0. ],
[ 0. , 6.958 , 10.074 , 9.949, 8.107, 5.832, 3.973 , 2.635 , 1.7 , 1.034 , 0.534 , 0.129, -0.229, -0.57 , -0.913 , -1.258 , -1.59 , -1.864, -2.007 , -1.924 , -1.543 , -0.866 , 0. ],
[ 0. , 3.812 , 6.053 , 6.564, 5.896, 4.712, 3.511 , 2.493 , 1.685 , 1.048 , 0.529 , 0.079, -0.342, -0.768 , -1.22 , -1.705 , -2.203 , -2.654, -2.941 , -2.904 , -2.395 , -1.375 , 0. ],
[ 0. , 2.237 , 3.761 , 4.358, 4.202, 3.609, 2.867 , 2.142 , 1.498 , 0.943 , 0.455 , 0.002, -0.452, -0.94 , -1.495 , -2.139 , -2.864 , -3.607, -4.2 , -4.357 , -3.76 , -2.237 , 0. ],
[ 0. , 1.375 , 2.396 , 2.906, 2.943, 2.656, 2.206 , 1.708 , 1.223 , 0.771 , 0.345 ,-0.076, -0.526, -1.045 , -1.682 , -2.491 , -3.509 , -4.71 , -5.895 , -6.563 , -6.052 , -3.812 , 0. ],
[ 0. , 0.867 , 1.543 , 1.925, 2.009, 1.865, 1.592 , 1.261 , 0.915 , 0.573 , 0.232 ,-0.126, -0.531, -1.031 , -1.698 , -2.633 , -3.971 , -5.831, -8.105 , -9.948 , -10.073 , -6.958 , 0. ],
[ 0. , 0.548 , 0.986 , 1.242, 1.302, 1.205, 1.035 , 0.828 , 0.604 , 0.373 , 0.134 ,-0.128, -0.441, -0.852 , -1.445 , -2.372 , -3.911 , -6.536, -10.749 , -15.049 , -17.334 ,-13.947 , 0. ],
[ 0. , 0.34 , 0.609 , 0.755, 0.751, 0.618, 0.516 , 0.411 , 0.299 , 0.183 , 0.059 ,-0.081, -0.253, -0.491 , -0.859 , -1.499 , -2.766 , -5.652, -13.307 , -22.167 , -30.267 ,-31.497 , 0. ],
[ 0. , 0.203 , 0.357 , 0.416, 0.331, 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , -14.659 , -30.045 , -50.068 ,-81.776 ,-150. ],
[ 0. , 0.116 , 0.2 , 0.221, 0.157, 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , -15.284 , -33.286 , -58.184 ,-95.538 ,-150. ],
[ 0. , 0.062 , 0.104 , 0.112, 0.075, 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , -13.192 , -29.633 , -53.842 ,-92.192 ,-150. ],
[ 0. , 0.027 , 0.044 , 0.047, 0.03 , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , -7.851 , -18.211 , -35.36 ,-69.388 ,-150. ],
[ 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. , 0. ,-150. ]]
plt.matshow(mat, aspect='auto', norm=matplotlib.colors.SymLogNorm(0.1))
plt.show()
, который будет производить следующее изображение:
[ 1112] Объяснение :
В matplotlib
есть вариант нормализации, в вашем случае, когда вы обрабатываете относительно большое число, и небольшие числа, которые более важны, вам нужно будет войти ( т.е. логарифм) ваши значения, чтобы увидеть различия. Поскольку у вас также есть отрицательные числа, просто записать их в журнал не удастся (log (), очевидно, не обрабатывает отрицательные числа). Таким образом, есть SymLogNorm
, которые также обрабатывают отрицательные числа в той же форме. 0.1
является важным параметром, так как значения, близкие к нулю, стремятся к бесконечности, существует потребность в линейном диапазоне около нуля. Параметр linthresh (0.1
, как я выбрал здесь, обращаясь к значениям матрицы) позволяет пользователю указать размер этого диапазона (-linthresh, linthresh).
для более подробной информации: Документация SymLogNorm
Я не знаю, считается ли это « чрезмерное копирование », но вы можете использовать строковый поток:
std::ostringstream ss;
ss << someStreamBuf;
std::string s = ss.str();
Например, чтобы прочитать все из stdin в строку , выполните
std::ostringstream ss;
ss << std::cin.rdbuf();
std::string s = ss.str();
В качестве альтернативы вы также можете использовать istreambuf_iterator
. Вам нужно будет измерить, будет ли этот способ быстрее - я не знаю.
std::string s((istreambuf_iterator<char>(someStreamBuf)),
istreambuf_iterator<char>());
Обратите внимание, что someStreamBuf
выше предназначен для представления streambuf *
, поэтому возьмите его адрес по мере необходимости. Также обратите внимание на дополнительные круглые скобки вокруг первого аргумента в последнем примере, чтобы он не интерпретировал его как объявление функции, возвращающее строку и принимающее итератор и другой указатель функции («самый неприятный синтаксический анализ»).
Я думаю, это больше похоже на:
streambuf.commit( number_of_bytes_read );
istream istr( &streambuf );
string s;
istr >> s;
Я не изучал код basic_streambuf
, но считаю, что это должна быть только одна копия в строке.
Другая возможность с boost :: asio :: streambuf
- использовать boost :: asio :: buffer_cast
Причина, по которой вы можете создать const_buffer только из std :: string, заключается в том, что std :: string явно не поддерживает прямую запись на основе указателя в своем контракте. Вы можете сделать что-нибудь плохое, например, изменить размер вашей строки до определенного размера, затем использовать const_cast для константности из c_str () и обращаться с ней как с необработанным буфером char *, но это очень неприятно и однажды вызовет у вас проблемы.
Я использую std :: vector для моих буферов, потому что до тех пор, пока размер вектора не изменяется (или вы внимательно относитесь к изменению размера), вы можете без проблем писать прямой указатель. Если мне нужны некоторые данные в виде std :: string, я должен их скопировать, но, как я работаю с буферами чтения, все, что должно сохраняться за пределами обратного вызова чтения, должно быть скопировано независимо.