В качестве альтернативы можно полагаться на декартово произведение, предоставляемое itertools: itertools.product
, что позволяет избежать создания временного ключа или изменения индекса:
import numpy as np
import pandas as pd
import itertools
def cartesian(df1, df2):
rows = itertools.product(df1.iterrows(), df2.iterrows())
df = pd.DataFrame(left.append(right) for (_, left), (_, right) in rows)
return df.reset_index(drop=True)
Быстрая проверка:
In [46]: a = pd.DataFrame(np.random.rand(5, 3), columns=["a", "b", "c"])
In [47]: b = pd.DataFrame(np.random.rand(5, 3), columns=["d", "e", "f"])
In [48]: cartesian(a,b)
Out[48]:
a b c d e f
0 0.436480 0.068491 0.260292 0.991311 0.064167 0.715142
1 0.436480 0.068491 0.260292 0.101777 0.840464 0.760616
2 0.436480 0.068491 0.260292 0.655391 0.289537 0.391893
3 0.436480 0.068491 0.260292 0.383729 0.061811 0.773627
4 0.436480 0.068491 0.260292 0.575711 0.995151 0.804567
5 0.469578 0.052932 0.633394 0.991311 0.064167 0.715142
6 0.469578 0.052932 0.633394 0.101777 0.840464 0.760616
7 0.469578 0.052932 0.633394 0.655391 0.289537 0.391893
8 0.469578 0.052932 0.633394 0.383729 0.061811 0.773627
9 0.469578 0.052932 0.633394 0.575711 0.995151 0.804567
10 0.466813 0.224062 0.218994 0.991311 0.064167 0.715142
11 0.466813 0.224062 0.218994 0.101777 0.840464 0.760616
12 0.466813 0.224062 0.218994 0.655391 0.289537 0.391893
13 0.466813 0.224062 0.218994 0.383729 0.061811 0.773627
14 0.466813 0.224062 0.218994 0.575711 0.995151 0.804567
15 0.831365 0.273890 0.130410 0.991311 0.064167 0.715142
16 0.831365 0.273890 0.130410 0.101777 0.840464 0.760616
17 0.831365 0.273890 0.130410 0.655391 0.289537 0.391893
18 0.831365 0.273890 0.130410 0.383729 0.061811 0.773627
19 0.831365 0.273890 0.130410 0.575711 0.995151 0.804567
20 0.447640 0.848283 0.627224 0.991311 0.064167 0.715142
21 0.447640 0.848283 0.627224 0.101777 0.840464 0.760616
22 0.447640 0.848283 0.627224 0.655391 0.289537 0.391893
23 0.447640 0.848283 0.627224 0.383729 0.061811 0.773627
24 0.447640 0.848283 0.627224 0.575711 0.995151 0.804567
Я всегда просто смотрю на SHOW CREATE TABLE mydatabase.mytable
.
Для базы данных, похоже, вам нужно посмотреть SELECT DEFAULT_CHARACTER_SET_NAME FROM information_schema. SCHEMATA
.
0000
- ноль 0001
- один 0010
- два 0011
- от трех 0100
до 0111
- от четырех до семи Это все, что мы можем зайти в положительных результатах. 2 3 -1 = 7.
Для отрицательных:
1111
- отрицательных 1110
- отрицательных двух 1101
- отрицательных трех 1100
до 1000
- от четырех до восьми Обратите внимание, что вы получаете одно дополнительное значение для отрицательных значений ( 1000
= -8), которое не используется для положительные. Это потому, что 0000
используется для нуля. Это можно рассматривать как числовую строку компьютеров.
Различение положительных и отрицательных чисел
При этом первый бит получает роль символа " где, как если бы самый старший бит (крайний левый) равен 0
, вы можете сказать, что десятичное значение положительное.
Отрицательные числа «комплимент для одного» просто меняют знаковый бит, а затем отсчитывают от 0. Но этот подход связан с интерпретацией 1000
как «отрицательного нуля», что сбивает с толку. Обычно об этом нужно беспокоиться только при работе рядом с оборудованием.
0
, вы можете сказать, что десятичное значение положительное.
Отрицательные числа «комплимент для одного» просто меняют знаковый бит, а затем отсчитывают от 0. Но этот подход связан с интерпретацией 1000
как «отрицательного нуля», что сбивает с толку. Обычно об этом нужно беспокоиться только при работе рядом с оборудованием.
2's дополнение является по существу способом придумать аддитивную инверсию двоичного числа. Спросите себя это: Учитывая число в двоичной форме, что комбинация двоичных разрядов при добавлении к исходному числу сделает нуль результата? Если можно придумать эту комбинацию двоичных разрядов затем, что комбинация двоичных разрядов является-ve представлением (аддитивная инверсия) исходного числа; поскольку по определению добавление числа к его аддитивной инверсии должно всегда приводить к нулю. Пример: возьмите 101, который является десятичный 5. Теперь задача состоит в том, чтобы придумать немного шаблона, который при добавлении к данной комбинации двоичных разрядов (101) приведет к нулю. Чтобы сделать это, запустите с права большую часть бита 101 и для каждого отдельного бита, снова задайте тот же вопрос: Какой бит я должен добавить к "этому" биту для создания нуля результата? продолжите делать то взятие в учетной записи обычный перенос. После того, как мы сделаны с 3 правами большинство мест (цифры, которые определяют исходное число без учета к начальным нулям), последний перенос входит в комбинацию двоичных разрядов аддитивной инверсии. Кроме того, так как мы могли держать в исходном числе в, говорят, что единственный байт, все другие ведущие биты в аддитивной инверсии должны также быть 1's так, чтобы, когда компьютер добавляет число и его аддитивную инверсию с помощью "того" типа хранения (символ), результатом в том символе были бы все нули.
1 1 1
----------
1 0 1
1 0 1 1 ---> additive inverse
---------
0 0 0
В простом термине 2's Complement
способ сохранить отрицательное число в Памяти компьютера. Принимая во внимание, что Положительные числа хранятся как Нормальное Двоичное число.
Позволяют нам полагать, что этот пример,
Компьютерное использование Binary Number System
представляет любое число.
x = 5;
Это представлено как 0101
.
x = -5;
, Когда компьютерный encouters -
знак, это вычисляет, это - 2 дополнение и хранит его. i.e
5 = 0101 и это 2, дополнение 1011
.
Важное компьютерное использование правил для обработки чисел,
1
затем, это должно быть negative
число. 0
затем, это - положительное число, потому что нет никакого -0
в системе счисления. (1000 is not -0
вместо этого это положительно 8
) 0
затем, это 0
. positive number
. Представьте, что у вас есть конечное число битов / тритов / цифр / чего угодно. Вы определяете 0 как все цифры, равные 0, и естественным образом считаете вверх:
00
01
02
..
В конце концов, вы переполнитесь.
98
99
00
У нас есть две цифры, и мы можем представить все числа от 0 до 100. Все эти числа положительные! Предположим, мы тоже хотим представлять отрицательные числа?
На самом деле у нас есть цикл. Число перед 2 - 1. Число перед 1 - 0. Число перед 0 - это ... 99 .
Итак, для простоты предположим, что любое число больше 50 отрицательно. «0» - «49» представляют от 0 до 49. «99» равно -1, «98» равно -2, ... «50» равно -50.
Это представление является десятичным дополнением . Компьютеры обычно используют дополнение до двух , что то же самое, за исключением использования битов вместо цифр.
Хорошая особенность дополнения до десяти состоит в том, что сложение просто работает . Для сложения положительных и отрицательных чисел ничего особенного делать не нужно!
Интересно, можно ли это объяснить лучше, чем статья в Википедии.
Основная проблема, которую вы пытаетесь решить с помощью представления с дополнением до двух, - это проблема хранения отрицательных целых чисел.
Сначала рассмотрим целое число без знака, хранящееся в 4 битах. У вас могут быть следующие
0000 = 0
0001 = 1
0010 = 2
...
1111 = 15
Они беззнаковые, потому что нет указания, отрицательные они или положительные.
Чтобы сохранить отрицательные числа, вы можете попробовать ряд вещей. Во-первых, вы можете использовать обозначение величины знака, которое назначает первый бит как знаковый бит для представления +/-, а остальные биты - для представления величины. Итак, снова используя 4 бита и предполагая, что 1 означает -, а 0 означает +, у вас есть
0000 = +0
0001 = +1
0010 = +2
...
1000 = -0
1001 = -1
1111 = -7
Итак, вы видите проблему? У нас есть положительный и отрицательный 0. Более серьезная проблема - это сложение и вычитание двоичных чисел. Схемы сложения и вычитания с использованием знаковых величин будут очень сложными.
Что такое
0010
1001 +
----
?
Другая система - избыточное обозначение . Вы можете хранить отрицательные числа, вы избавляетесь от проблемы двух нулей, но сложение и вычитание остаются трудными.
Итак, приходит два дополнения. Теперь вы можете хранить положительные и отрицательные целые числа и относительно легко выполнять арифметические операции. Существует несколько способов преобразования числа в дополнение до двух. Вот один.
Преобразование числа в двоичное (пока игнорируйте знак) Вы можете хранить отрицательные числа, вы избавляетесь от проблемы двух нулей, но сложение и вычитание остаются трудными.
Итак, приходит два дополнения. Теперь вы можете хранить положительные и отрицательные целые числа и относительно легко выполнять арифметические операции. Существует несколько способов преобразования числа в дополнение до двух. Вот один.
Преобразование числа в двоичное (пока игнорируйте знак) Вы можете хранить отрицательные числа, вы избавляетесь от проблемы двух нулей, но сложение и вычитание остаются трудными.
Итак, приходит два дополнения. Теперь вы можете хранить положительные и отрицательные целые числа и относительно легко выполнять арифметические операции. Существует несколько способов преобразования числа в дополнение до двух. Вот один.
Преобразование числа в двоичное (пока игнорируйте знак) например, 5 - 0101, а -5 - 0101
Если число положительное, то все готово. например, 5 - это 0101 в двоичной системе с использованием записи дополнения до двух.
Если число отрицательное, то
3.1 найти дополнение (инвертировать нули и единицы) например, -5 равно 0101, поэтому нахождение дополнения равно 1010
3.2 Добавьте 1 к дополнению 1010 + 1 = 1011. Следовательно, -5 в дополнительном двоичном коде составляет 1011.
Итак, что, если вы хотите получить 2 + (-3) в двоичном формате? 2 + (-3) равно -1. Что бы вы сделали, если бы складывали эти числа с помощью знаковой величины? 0010 + 1101 =?
Используя дополнение до двух, подумайте, насколько это было бы легко.
2 = 0010
-3 = 1101 +
-------------
-1 = 1111
Преобразование 1111 в десятичное:
Число начинается с 1, поэтому оно отрицательное, поэтому мы находим дополнение к 1111, то есть 0000.
Добавьте 1 к 0000, и мы получим 0001.
Преобразуем 0001 в десятичное, что равно 1.
Примените знак = -1.
Tada!
I liked lavinio's answer, but shifting bits adds some complexity. Often there's a choice of moving bits while respecting the sign bit or while not respecting the sign bit. This is the choice between treating the numbers as signed (-8 to 7 for a nibble, -128 to 127 for bytes) or full-range unsigned numbers (0 to 15 for nibbles, 0 to 255 for bytes).